[英]Java Swing making the thread wait once
我试图让我的GUI在图形中最近更新后等待2秒。 这意味着我使用后:
boardLogo.repaint();
boardLogo.revalidate();
我希望GUI等待进行进一步的计算,然后再次绘制它们。
编码:
SwingUtilities.invokeLater(new Runnable() {
@SuppressWarnings("rawtypes")
@Override
public void run() {
SwingWorker swingWorkerExample = new SwingWorker(){
@Override
protected Object doInBackground() throws Exception {
return null;
}
protected void done(){
try {
Thread.sleep(2000); //wait 2 seconds.
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
swingWorkerExample.execute();
}
});
//.... more code here
boardLogo.repaint();
boardLogo.revalidate();
但是当我运行它时-首先它执行最后两行,然后等待2秒钟...
老实说,我对Threads和Java Swing的了解不是最好的(特别是在了解swing worker时,我已经尝试从Oracle网站上进行了了解),因此,如果答案会很详细,我将不胜感激。
谢谢!
当我运行它时-首先它执行最后两行,然后等待2秒钟...我对线程和Java Swing的了解不是最好的。
您说, 它执行最后两行。 曾经停下来想知道这是什么吗?
这是一个线程。 线程是Java程序中执行代码的对象,执行的每一行都由某个线程执行。
当您的代码调用invokeLater()
,它将提交要由Swing的事件分配线程 (EDT)执行的任务 (即一段代码)。 当您的代码调用swingWorker.execute()
它正在提交要由Swing的后台线程之一执行的任务。
在程序中有多个线程的整点是,他们可以在同一时间做不同的事情。
在您的情况下,您使EDT睡眠了两秒钟,与此同时,其他线程正在调用boardLogo.repaint();
和boardLogo.revalidate();
关于Swing和多线程,有几件重要的事情要知道:
您所有的事件处理程序都将由EDT运行。
事件处理程序绝不应该花费超过一秒钟的时间,因为在处理程序返回之前,您的应用程序将无法响应任何其他事件(即,它看起来像是“挂起”)。
不允许其他任何线程与Swing的GUI组件进行交互。
invokeLater()
一个重要用例是,后台线程中运行的代码如何与GUI组件进行通信。 invokeLater()提交将在EDT中运行的任务 (即一段代码)。
SwingWorker的主要用例与之完全相反:这是在EDT中运行的事件处理程序如何启动一项任务的过程 ,该任务将花费一秒钟以上的时间来完成。
您可以通过Swing并发教程中的方法来学习这些知识: https : //docs.oracle.com/javase/tutorial/uiswing/concurrency/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.