如何知道我是否在事件调度线程上?

1.考虑到我的代码在我拥有的JPanel的某行上,我是否自动在EDT上?

2.对于不属于GUI,JPanels或其他视图类的所有其他类,简单逻辑类,都有相同的问题。

3.如果我有JPanel,我在其中播放音乐,音乐应该在事件调度线程或其他不是EDT的线程上运行(因为不会阻塞GUI,尽管我没有感觉到从EDT运行它有任何问题)?

注意:我想要一个一般规则,如何在不使用感谢
的情况下了解它SwingUtilities.isEventDispatchThread()


答案 1
  1. 不。
  2. 不。
  3. 后台线程。

如果在 EDT 外部运行的代码调用 GUI 类中定义的方法,则该代码将不会在 EDT 上运行,而是在调用线程中运行。

如果在 EDT 中运行的代码调用在非 GUI 类中定义的代码,则该代码将在 EDT 上运行。

规则是,如果您没有创建不同的线程,则调用的方法将在运行调用代码的线程上运行 - 线程与定义方法的类不对应。

将在 EDT 上运行的方法是事件侦听器,当它们由 Swing 调用时,而不是由您调用。(不过,如果您从EDT打电话给他们,他们仍然可能是。

此外,传递给 SwingUtilities.invokeLater()invokeAndWait() 的方法中的任何代码也在 EDT 上运行。Runnable.run()

从 EDT 调用的任何常规方法都将在 EDT 上运行。

从您创建的 调用的任何代码(无论是直接使用线程,还是 使用 、 或 ) 都不在 EDT 上。您的程序方法也不在 EDT 上。ThreadExecutorServiceSwingWorker.doInBackground()main()


答案 2

根据我的评论:当所有其他方法都失败时,SwingUtilities类有一个静态方法,您可以使用它:SwingUtilities.isEventDispatchThread()

关于数字3)绝对使用后台线程。

据我所知,没有“一般规则”。是的,GUI中的代码应该在EDT上,但是如果您在某个地方有错误,它可能不是,尽管通常是这样。对于 Swing 听众也是如此。


推荐