我是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();
答案 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()方法。