15

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

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

3.如果我有JPanel,我正在播放音乐,音乐应该在事件调度线程或其他不是EDT的线程上运行(因为不阻塞GUI,虽然我觉得运行没有任何问题它来自美国东部时间)?

注意:我想要一个通用规则,如何在不使用SwingUtilities.isEventDispatchThread()
Thanks的情况下知道它

4

2 回答 2

24
  1. 不。
  2. 不。
  3. 背景线程。

如果在 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 上。

于 2011-10-22T23:50:45.350 回答
9

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

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

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

于 2011-10-22T23:22:32.600 回答