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

时间:2011-10-22 23:16:24

标签: java swing jpanel javasound event-dispatch-thread

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

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

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

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

2 个答案:

答案 0 :(得分:23)

  1. 没有
  2. 没有
  3. 后台主题。
  4. 如果在EDT外部运行的代码调用GUI类中定义的方法,则该代码不会在EDT上运行,而是在调用线程中运行。

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

    规则是,如果你没有创建一个不同的线程,你正在调用的方法将在运行调用代码的线程上运行 - 线程与定义的类方法不对应。

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

    此外,传递给SwingUtilities.invokeLater()invokeAndWait()Runnable.run()方法中的任何代码也会在EDT上运行。

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

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

答案 1 :(得分:9)

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

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

据我所知,没有“一般规则”。您的GUI 中的代码应在EDT上,但如果您在某处有错误,可能不是,但通常情况下是这样。对于Swing监听器也是如此。