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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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