我怎么知道我是否在事件发送线程上?

Jav*_*aSa 14 java swing javasound jpanel event-dispatch-thread

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

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

3.如果我有JPanel我正在播放音乐,那么音乐应该在事件发送线程上运行还是在非EDT的其他线程上运行(因为我没有遇到任何运行问题)来自EDT)?

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

mil*_*ose 23

  1. 没有.
  2. 没有.
  3. 背景线程.

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

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

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

在EDT上运行的方法是事件监听器,当它们被Swing调用时 - 而不是你.(如果你从EDT打电话给他们,他们仍然可能会这样.)

此外,内部的任何代码Runnable.run()的方法传递给SwingUtilities.invokeLater()invokeAndWait()也对EDT运行.

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

Thread您创建的任何代码调用(无论是直接使用线程,还是ExecutorService或者SwingWorker.doInBackground())都不在EDT上.您的计划main()方法也不在EDT上.


Hov*_*els 9

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

关于数字3)肯定使用后台线程.

据我所知,没有"一般规则".你的GUI中的代码应该在EDT上,但是如果你在某个地方有bug,它可能不是,尽管通常是.对于Swing监听器也是如此.