Java EventQueue.invokeLater做什么以及vs start()线程?
嗨,我是Opp和Java的新手 我看到了一些关于thread、implements Runnable、start()调用调用run()的内容 但这有什么用呢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组
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"...
}
});