Java EventQueue.invokeLater做什么以及vs start()线程?

Java EventQueue.invokeLater做什么以及vs start()线程?,java,multithreading,swing,invokelater,eventqueue,Java,Multithreading,Swing,Invokelater,Eventqueue,嗨,我是Opp和Java的新手 我看到了一些关于thread、implements Runnable、start()调用调用run()的内容 但这有什么用呢 EventQueue invokeLater(); 或者你可以在这篇文章的主要方法中找到这一行: 关于这一点的答案与主要方法相同: 调用run()方法? 这和你的想法有什么区别 Thread var = new Thread(this); var.start(); SwingAPI是单线程的:您只能从Swing线程调用Swing组

嗨,我是Opp和Java的新手

我看到了一些关于thread、implements Runnable、start()调用调用run()的内容

但这有什么用呢

EventQueue

invokeLater();
或者你可以在这篇文章的主要方法中找到这一行:

关于这一点的答案与主要方法相同:

调用run()方法? 这和你的想法有什么区别

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

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

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

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


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

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

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

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

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

我看到了一些关于线程、可运行的实现的信息

忘了你曾经见过。那是一个不好的主意,应该加以反对。如果要在java程序中创建显式线程,请执行以下操作:

Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        ...code to be run in the thread goes here...
    }
});
我不会在这里解释原因,但请相信我。现在养成这个好习惯

这是干什么用的。。。调用器

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

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

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

我看到了一些关于线程、可运行的实现的信息

忘了你曾经见过。那是一个不好的主意,应该加以反对。如果要在java程序中创建显式线程,请执行以下操作:

Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        ...code to be run in the thread goes here...
    }
});
我不会在这里解释原因,但请相信我。现在养成这个好习惯

这是干什么用的。。。调用器

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

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

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

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