- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我只是想知道是否仍然有必要确保 invokeLater() Runnable 中的同步性。
我遇到了死锁,需要在保持并发的同时克服它。
这会是好的代码示例吗?:
private String text;
private void updateText()
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
synchronized(FrameImpl.this)
{
someLabel.setText(text);
}
}
});
}
对于这个相当糟糕的示例,我们深表歉意,但我们必须假设 text
正在被不同的线程修改,无法注入(inject),并且依赖于正确的值。
这是正确的解决方案,还是我会通过将同步代码发送到未知上下文而无意中造成死锁问题?
谢谢。
最佳答案
更好的解决方案是这样的:
public class Whatever {
private String text;
private final Object TEXT_LOCK = new Object();
public void setText(final String newText) {
synchronized (TEXT_LOCK) {
text = newText;
}
SwingUtilities.invokeLater(new Runnable() {
public void run() {
someLabel.setText(newText);
}
});
}
public String getText() {
synchronized (TEXT_LOCK) {
return text;
}
}
}
这将确保如果两个线程尝试同时调用 setText
那么它们将不会互相干扰。第一个线程将设置 text
的值并使用该值将 UI 更新加入队列。第二个线程还将设置 text
的值并将第二个 UI 更新加入队列。
最终结果是 UI 最终将显示最新的文本值,但内部 text
变量将立即包含最新的值。
一些注意事项:
TEXT_LOCK
)意味着您不容易受到其他地方的代码将监视器锁定在 Whatever
实例上并无意中导致死锁。最好始终严格控制锁定对象。最好尽量减少同步块(synchronized block)的大小。setText
方法同步,但需要注意的是,它确实会使您可能容易受到上述死锁的影响。text
的值也需要同步,即使 Strings
是不可变的。 Java 内存模型有一些微妙之处,这意味着您总是需要围绕可由多个线程读取/写入的变量进行同步。查看 Brian Goetz 的 Java Concurrency in Practice深入研究并发的棘手部分(包括内存模型怪异)。
关于Java Swing EDT 和并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6839364/
只是想一想我的一些重复代码: Runnable run = new Runnable() { @Override public void run() { // Some EDT cod
我在 Java 库中使用一个 API,它从事件分派(dispatch)线程调用并要求我返回一个完全初始化的 UI 组件。它看起来像这样: public JDialog createDialog()
我有一个在 EDT 上运行的方法,我想让它在一个新的(非 EDT)线程上执行一些事情。我当前的代码如下: @Override public void actionPerformed(Actio
我有以下测试方法: @Test public void f3KeystrokeShowsHotkeysDialog() throws AWTException{ App app = new A
我正在开发一个项目,该项目需要进行一些密集的数学计算(矩阵、 vector 数组等),因此我很自然地将工作分成多个作业,并将它们提交给 CompletionService 以并行执行工作. 每个作业对
所以我对 MVC 结构还很陌生。我真的很困惑何时何地在 EDT 上添加我的 Gui 部分。这是我真正困惑的地方: public class ECPS_MVC { //edt? Ecps
如果从 EDT 线程调用某些方法出现未经检查的异常,会发生什么情况?它能保持 GUI 的响应能力还是什么?谢谢您 最佳答案 Before restarting, does the EDT shutdo
我对了解 Swing 乐和 EDT 的追求再次继续...... 由于 EDT 是唯一的 EDT,所以我现在想知道哪些方法、构造函数和任何其他内容应该在 EDT 中完成。我知道一般规则,几乎所有创建 S
该示例不断绘制各种颜色的方 block 。方 block 的数量取决于 JFrame 的大小。 在执行示例时,使用鼠标放大或缩小尺寸框,将会增加或减少可见闪烁方 block 的数量。 该帧的时间栏显示
我按照别人告诉我的方式处理我的游戏循环,添加了 Swing 计时器等(除了重写paintComponent,因为它在这种情况下不适用),但我的游戏循环拒绝调用事件调度线程。因此,JFrame 不会关闭
正如我在 earlier post 上与 Inerdia 讨论的那样, 事情仍然很奇怪当我在一些 JPanel 中(肯定是 EDT - 我用方法检查进行了检查)然后我调用一些动画线程(线程扩展线程)来
我想创建新线程(用于服务器)。我有 textArea 来放置日志,我创建了一个新的类状态来处理它。我为对象“服务器”运行新线程,尝试将状态对象“传递”到服务器,并且执行 status.setStatu
我正在用 Java 编写 Sugarscape 模拟,需要一个工作的 GUI。 Sugarscape 是一种空间景观,由(糖的)瓷砖和移动和消耗糖的代理组成。为简单起见,我只有一个代理,没有糖——我只
如何知道 EDT 被阻塞(不是直观地而是通过检查线程本身)?有办法吗? 我正在完成最后的大学毕业任务,其中有一堆图表,但对 Swing EDT(通常是 Java)知之甚少。 看看这篇文章: Swin
我一直在问很多关于我最近正在进行的项目的问题。这是我所处的场景,任何帮助或指出正确方向都会有很大帮助...... 这是一个由一个服务器和多个客户端构建的网络程序。每个客户端都有一个 GUI,它必须根据
我有一个在 EDT 内执行的方法。事情是这样的: myMethod() { System.out.prinln(SwingUtilities.isEventDispatchThread());
我正在尝试学习 Swing 的复杂性,并且已经阅读了大量有关事件调度线程的内容。我明白这是为了什么,但是我正在为以下概念而苦苦挣扎: 我有一个以正常方式调用的 JFrame: public cla
我想知道 Java 中的事件调度线程何时启动。 它是主线程,还是在Window/Frame构造函数中启动? 如果检测到 AWT/Swing 的使用,是否由 JVM 启动? 最佳答案 主线程不是 EDT
我认为提出问题的最简单方法是逐步解决问题。我对 EDT 的某些工作原理有些困惑。 是否有任何对象是从在 EDT 上创建的 Swing 组件创建的? 要扩展这个问题,如果我创建一个 JFrame,并在其
嗨,我想在 EDT 之外完成一项任务: new Thread(new Runnable(){ @Override public void
我是一名优秀的程序员,十分优秀!