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