1

嗨,我是 Opp 和 Java 的新手。

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

但这有什么作用?

EventQueue

invokeLater();

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

和主要方法上相同的答案: Mac OS 不支持 Java 页面翻转?

EventQueue.invokeLater(new NewTest());

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

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

2 回答 2

4

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

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

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

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

于 2014-05-09T08:38:56.553 回答
0

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

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

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

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

这是做什么的?...稍后调用...

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

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

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

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

于 2014-05-09T14:19:07.190 回答