【问题标题】:What does EventQueue.invokeLater do and that vs start() Thread?EventQueue.invokeLater 和 start() 线程做什么?
【发布时间】:2014-06-26 21:45:02
【问题描述】:

你好,我是 Opp 和 Java 的新手。

我看到了一些关于线程的东西,实现了 Runnable , start() 来调用 run()。

但这有什么作用呢?

EventQueue

invokeLater();

或者你可以在这篇文章中找到关于 main 方法的完整行: JTextFields on top of active drawing on JPanel, threading problems

以及关于 main 方法的相同答案: Java page flipping not supported on Mac OS?

EventQueue.invokeLater(new NewTest());

那调用run()方法? 那和有什么区别

Thread var = new Thread(this);
var.start();

【问题讨论】:

标签: java multithreading swing invokelater eventqueue


【解决方案1】:

Swing API 是单线程的:您只能从 Swing 线程调用 Swing 组件上的方法。

您的应用程序中可以有多个线程,但是当另一个线程需要与 swing 组件交互时,它需要使用 EventQueue.invokeLater 进行交互。这可确保Runnable 在正确的线程上运行。

启动你自己的Thread 没有这个效果(在Swing线程上运行),所以它不是一个替代方案。如果这样做,可能会导致数据损坏、屏幕更新不正确等。这可能是暂时的,但也可能无法修复。

但是invokeLater 方法不能替代运行您自己的线程或使用线程池,因为传递给它的所有Runnables 都是按顺序执行的,而不是并行执行的。

【讨论】:

    【解决方案2】:

    我看到了一些关于线程的东西,实现了 Runnable

    忘记你曾经见过。这是一个应该被弃用的坏主意。如果你想在 java 程序中创建一个显式线程,可以这样做:

    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            ...code to be run in the thread goes here...
        }
    });
    

    我不会在这个领域解释为什么,但请相信我。现在就养成一个好习惯。

    这是做什么的? ...invokeLater...

    swing 包创建一个响应“事件”(鼠标点击、按键等)的线程,并且您为 swing 编写的许多代码作为该线程调用的“处理程序”运行。

    有时,您的处理程序想要做一些在调用它的上下文中不允许/没有意义的事情。我不是一个swing程序员,所以我没有一个方便的例子,但解决方案是调用invokeLater()

    EventQueue invokeLater(new Runnable() {
        @Override
        public void run() {
            ...code that you want to run "later"...
        }
    });
    

    这会将一个新事件发布到事件队列中,当事件线程将其从队列中取出时,它将执行您提供的 run() 方法。

    【讨论】:

      猜你喜欢
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 2016-04-08
      • 1970-01-01
      • 2014-11-17
      • 1970-01-01
      • 2023-03-31
      • 2015-10-20
      相关资源
      最近更新 更多