我怎么知道我是否在事件发送线程上?
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()
的Runnable.run()
方法中的任何代码也在EDT上运行。
您从EDT调用的任何常规方法都将在EDT上运行。
从您创建的Thread
调用的任何代码(无论是直接使用线程,还是使用ExecutorService
或SwingWorker.doInBackground()
) 都不在EDT上。 您的程序的main()
方法也不在EDT上。
根据我的评论:当所有其他方法都失败时, SwingUtilities类有一个可以使用的静态方法: SwingUtilities.isEventDispatchThread()
关于数字3)肯定使用后台线程。
据我所知,没有“一般规则”。 你的GUI中的代码应该在EDT上,但如果你在某个地方有bug,它可能不是,尽管通常是。 对于Swing监听器也是如此。