关于Swing GUI中的线程

时间:2014-03-15 03:03:36

标签: java multithreading swing 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.
    } );
}

1 个答案:

答案 0 :(得分:6)

  

一个我声明一个线程,并在其中运行一些东西 - 一切都来自   除非我明确说明,否则该点将在该线程内运行   创建一个新线程。无论代码有多少个类和方法   通过 - 它将保持在同一个线程中。

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

  

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

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