关于Swing GUI中的线程

Avi*_*ohn 1 java swing multithreading event-dispatch-thread

我想确保我明白一些事情.请确认这是否属实.

一个我声明一个线程,并在其中运行一些东西 - 从那一点开始的一切都将在该线程内运行,除非我明确地创建一个新线程.无论代码通过多少个类和方法 - 它都将保留在同一个线程中.

例如,假设我有一个完全在一个自定义JFrame内运行的应用程序.如果我希望整个应用程序在同一个线程内运行,我可以通过创建一个新线程,并在该线程的run()方法中实例化新的JFrame来实现.

这实际上是否会确保整个应用程序将在创建JFrame的线程内运行,除非我显式创建一个新线程并在该新线程内运行某些东西?

这是一个普遍的问题,但让我先谈谈Swing:

如果我希望整个Swing应用程序在EDT内运行(如果我错了请纠正我 - 正是我大部分时间都需要使用Swing),SwingUtilities.invokeLater()main方法中使用一次就足够了,如下所示:

public static void main(String[]args){
    SwingUtilities.invokeLater( new Runnable(){
         JFrame frame = new CustomJFrame(); // where the entire application runs.
    } );
}
Run Code Online (Sandbox Code Playgroud)

m0s*_*it0 6

一个我声明一个线程,并在其中运行一些东西 - 从那一点开始的一切都将在该线程内运行,除非我明确地创建一个新线程.无论代码通过多少个类和方法 - 它都将保留在同一个线程中.

正确.实际上,即使您创建了一个新线程,当前的线程执行流也永远不会改变.这个新线程将在您启动它之后的某个时间开始执行,但它的流程与创建它的线程无关.

哪个 - 如果我错了请纠正我 - 正是我大部分时间都需要使用Swing

你错了.你不想在EDT中做所有事情.EDT中的任何数据获取和操作都会降低GUI的重复性.比如说你想从数据库中获取大量数据.如果你在EDT中这样做,你的GUI将冻结,用户将无法与它进行交互,直到你完成它(并可能操纵它).