1.考虑我的代码在我拥有的 JPanel 的某行上,我是否自动在 EDT 上?
2.对于不属于 GUI、JPanels 或其他视图类、简单逻辑类的所有其他类,同样的问题。
3.如果我有JPanel,我正在播放音乐,音乐应该在事件调度线程或其他不是EDT的线程上运行(因为不阻塞GUI,虽然我觉得运行没有任何问题它来自美国东部时间)?
注意:我想要一个通用规则,如何在不使用SwingUtilities.isEventDispatchThread()
Thanks的情况下知道它
1.考虑我的代码在我拥有的 JPanel 的某行上,我是否自动在 EDT 上?
2.对于不属于 GUI、JPanels 或其他视图类、简单逻辑类的所有其他类,同样的问题。
3.如果我有JPanel,我正在播放音乐,音乐应该在事件调度线程或其他不是EDT的线程上运行(因为不阻塞GUI,虽然我觉得运行没有任何问题它来自美国东部时间)?
注意:我想要一个通用规则,如何在不使用SwingUtilities.isEventDispatchThread()
Thanks的情况下知道它
如果在 EDT 之外运行的代码调用在 GUI 类中定义的方法,则该代码将不会在 EDT 上运行,而是在调用线程中运行。
如果在 EDT 中运行的代码调用在非 GUI 类中定义的代码,则该代码将在 EDT 上运行。
规则是,如果您不创建不同的线程,则您正在调用的方法将在运行调用代码的线程上运行——线程与定义的类方法不对应。
将在 EDT 上运行的方法是事件侦听器,当它们由 Swing 调用时,而不是由您调用。(如果你从 EDT 给他们打电话,他们仍然可能是。)
此外,方法中的任何代码都Runnable.run()
传递给EDTSwingUtilities.invokeLater()
并invokeAndWait()
在 EDT 上运行。
您从 EDT 调用的任何常规方法都将在 EDT 上运行。
从您创建的 a 调用的任何代码Thread
(无论是直接使用线程,还是ExecutorService
,或SwingWorker.doInBackground()
)都不在 EDT 上。您的程序的main()
方法也不在 EDT 上。
根据我的评论:当所有其他方法都失败时,SwingUtilities类有一个可以使用的静态方法:SwingUtilities.isEventDispatchThread()
关于数字 3) 绝对使用后台线程。
据我所知,没有“一般规则”。是的,您的 GUI 中的代码应该在 EDT 上,但如果您在某处有错误,则可能不是,尽管通常是。Swing 听众也一样。