EventQueue.invokeLater和vs start()Thread做了什么?

时间:2014-05-09 08:17:44

标签: java multithreading swing invokelater eventqueue

我是Opp和Java的新人。

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

但这是做什么的?

EventQueue

invokeLater();

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

以及关于主要方法的答案: Java page flipping not supported on Mac OS?

EventQueue.invokeLater(new NewTest());

调用run()方法? 它和

之间有什么区别
Thread var = new Thread(this);
var.start();

2 个答案:

答案 0 :(得分:4)

Swing API是单线程的:只允许从swing线程调用Swing组件上的方法。

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

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

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

答案 1 :(得分:0)

  

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

忘了你曾经看过那个。这是一个应该被弃用的坏主意。如果要在java程序中创建显式线程,请执行以下操作:

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

我不会在这个空间解释为什么,但请相信我。现在进入是一个好习惯。

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

swing包创建一个响应" events" (鼠标点击,按键等),你为swing写的很多代码都是以"处理程序"那个线程调用的。

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

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

这将向事件队列发布一个新事件,当事件线程从队列中选择它时,它将执行您提供的run()方法。