问题标签 [event-dispatch-thread]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1163 浏览

java - 无法让 Swing 刷新 JLabel(显然在事件调度线程上)

我有这个动作监听器:

}

refreshScreen()s 似乎不起作用。它们显然在 Event Dispatcher 线程上运行,所做的更改仅在动作侦听器执行结束时显示。从 MokkiGUI() 构造函数调用时它工作正常,因为它不在 EDT 上。

0 投票
4 回答
5263 浏览

java - 检查线程是否需要 EDT?

我有一个用 Swing 实现的 UI。一个组件做了一些可能需要一些时间的工作,所以我使用SwingUtilities.invokeLater. 但是,我正在阅读一些旧代码,并在以下位置找到了这个ActionListener

我认为这是有道理的,因为它与code XEDT 是分开的。但是,我发现它很容易出错,因为我已经使用了几次,而且两次都忘记了这个else零件。

问题是:SwingUtilities.isEventDispatchThread()检查是否必要?或者我可以假设我不在 EDT 中并且总是使用invokeLater

非常感谢。

0 投票
4 回答
3839 浏览

java - Swing verify code on Event Dispatch Thread at runtime

Are there any libraries that instrument code to verify that methods called on Swing components are called on the Event Dispatch Thread? It probably wouldn't be too difficult to write some basic code for doing this, but I'm sure there are edge cases and whatnot that other people have handled. I'm looking for this at runtime though, not for unit tests.

0 投票
3 回答
1574 浏览

java - 抛出异常时 EDT 是否重新启动?

(下面的示例代码是独立且可运行的,您可以尝试一下,它不会使您的系统崩溃:)

Tom Hawtin 在这里评论了这个问题:Why do people run Java GUI's on the Event Queue

那:

EDT 不太可能崩溃。在 EDT 调度中抛出的未经检查的异常被捕获、转储并且线程继续。

有人可以解释一下这里发生了什么(每次单击“抛出未经检查的异常”按钮时,都会故意除以零):

我收到以下消息(这是我所期望的):

对我来说,这是一个未经检查的例外,对吧?

您可以看到每次触发崩溃时线程 ID 都会增加。

那么,EDT 是否会在每次引发未经检查的异常时自动重新启动,或者像 Tom Hawtin 评论的那样,未经检查的异常“被捕获、转储并且线程继续” ?

这里发生了什么?

0 投票
7 回答
2047 浏览

java - 如何在事件调度线程上运行类的所有方法

我创建了一个具有多种方法的 Swing 组件。我希望这个类的所有方法都在 Swing 事件调度线程 (EDT) 上运行,而调用者在 Worker 线程上。目前我想到的唯一解决方案是:

对于此类中的每个方法:

我应该将其重命名为:

并添加另一种方法:

但这不是很恶心吗?我该怎么做?

0 投票
3 回答
1338 浏览

java - 静态线程分析:好主意?

我帮助维护和构建一个相当大的 Swing GUI,有很多复杂的交互。我经常发现自己修复了由于代码中其他地方的某些竞争条件而导致事情进入奇怪状态的错误。

随着代码库变得越来越大,我发现通过文档指定哪些方法具有线程限制变得不太一致:最常见的是必须在 Swing EDT 上运行的方法。类似地,了解并提供静态感知(我们的自定义)侦听器在 EDT 上按规范通知是有用的。

所以我想到这应该是可以使用注释轻松执行的东西。瞧,至少存在一个静态分析工具CheckThread,它使用注释来完成此操作。它似乎允许您将方法声明为仅限于特定线程(最常见的是 EDT),并且会标记尝试调用该方法的方法,而无需同时声明自己仅限于该线程。

所以从表面上看,这似乎只是对源代码和构建周期的一种低痛苦、巨大的收益。我的问题是:

  • 对于使用 CheckThread 或类似库来强制执行线程约束的人,​​是否有任何成功案例?有失败的故事吗? 为什么成功/失败?
  • 这在理论上好吗? 有理论上的缺点吗?
  • 这在实践中好吗? 这值得么? 它传递了什么样的价值?
  • 如果它在实践中有效,有什么好的工具可以支持这一点? 我刚刚找到了 CheckThread,但承认我不完全确定我在寻找什么来寻找其他做同样事情的工具。

我知道这是否适合我们取决于我们的情况。但是我从来没有听说过有人在实践中使用过这样的东西,老实说,它似乎并没有从一些一般的浏览中占据太多。所以我想知道为什么。

0 投票
1 回答
767 浏览

java - JFrame 以及为什么要继续运行

为什么如果我创建一个 JFrame 然后程序仍然运行直到(即)我用窗口的小“退出按钮”关闭它?

我寻找这个答案,但我失败了。我唯一猜到的是,当我这样做时,new JFrame()它就像一个 special new,它在 EDT 中保留对象的引用,因此它将始终被引用(即使是匿名的“新”)并且它不会被删除垃圾收集器。然后一旦触发关闭窗口的事件,对象就会被取消引用并销毁。

0 投票
1 回答
1324 浏览

java - 在 EDT 之外执行长时间运行操作的正确方法是什么?

在桌面 Java 1.5 应用程序中(它必须在许多 MacOS X 机器上运行,由于 Apple 政治,这些机器会紧张地看到 1.6 VM)在 EDT 之外执行冗长计算的正确方法是什么?

例如,当用户单击启动操作的按钮时:我在 EDT 上收到通知,我想运行某个方法(例如crunchData())。

这是一种方法:

我的意思是:这可以满足我的要求,但是每次用户启动一个可能需要长时间运行的任务时,我都会使用上述成语。而且我觉得我总是在不必要地创建大量任务(此外,虽然有时操作可能很长,但有时不会,在这种情况下,我希望应用程序尽可能负责)。

另一种方法是让另一个(非 EDT)线程(或线程池)始终运行,比如说在阻塞队列上等待并执行,比如说,Runnable,我会在任何需要执行冗长的地方排队手术。

处理这个问题正确方法是什么?

编辑:处理简单安装的东西的正确方法是什么SwingWorker?人们是如何处理这个(这似乎很基本)SwingWorker的?

0 投票
4 回答
3027 浏览

java - 事件派发线程在哪里调用?

我读到所有构建 Swing 组件和处理事件的代码都必须由事件调度线程运行。我了解这是如何通过使用该SwingUtilities.invokeLater()方法来完成的。考虑以下代码,其中 GUI 初始化是在main方法本身中完成的

这段代码如何完美运行?我们正在JFrame主线程中构造和调用许多其他方法。我不明白 EDT 究竟在哪里出现(它正在执行什么代码?)。该类的构造函数GridBagLayoutTester也从该main方法中调用,这意味着 EDT 没有运行它。

简而言之

  1. EDT 什么时候开始?(如果在运行此代码时启动了 EDT,JVM 是否会与 main 方法一起启动 EDT?)
  2. 按钮的事件处理程序代码是否在 EDT 上运行?
0 投票
2 回答
410 浏览

java - 在事件调度线程中显示 JWindow

我想要做的是在我的程序加载某些内容时出现一个小的启动屏幕。这就是我所拥有的:

showSplashScreen() 方法所做的只是在屏幕中间创建一个新的 JWindow 并使其可见。

现在这段代码是从事件调度线程调用的,所以当调用 showSplashScreen() 方法时,在线程完成之前我看不到 JWindow,到那时,我不再需要窗口了。在我等待时显示此启动画面的最佳方式是什么?