Max*_*Max 13 java swing synchronization swingworker
说我有以下代码:
import java.lang.InterruptedException;
import javax.swing.SwingWorker;
public class Test
{
private JDialog window;
public Test
{
// instantiate window
}
private class Task extends SwingWorker<Void, Void>
{
public Void doInBackground()
{
try { Thread.currentThread().sleep(5000); }
catch(InterruptedException e) {}
return null;
}
}
public void doTask()
{
Task task = new Task();
task.execute();
}
protected void process()
{
// update various GUI components here
}
public static void main(String args[])
{
Test t = new Test();
t.doTask();
System.out.println("done");
}
}
Run Code Online (Sandbox Code Playgroud)
我需要等到t.doTask()
打印出"完成"之后再完成,但我不确定具体如何.我知道我应该join()
在这里使用,但我需要一个线程来调用它,我不知道如何doInBackground()
从我需要调用的地方获取线程join()
.谢谢你的帮助.
编辑:感谢您的回复.不幸的是,get()
等等并没有完全解决问题.在我的实际代码中,SwingWorker还有一个重写的process()
函数,在后台线程运行时更新GUI窗口. get()
确实停止打印直到之后doInBackground
,但GUI不会更新.我更新了我的示例代码来反映这一点,虽然现在它当然不会编译.
有没有办法让'完成'只打印一次doInBackground
完成?GUI更新代码和'done'语句是否在同一个线程上?我需要制作新帖吗?
Col*_*inD 11
通常,在SwingWorker
完成其后台工作之后需要完成的任何事情都是通过覆盖其中的done()
方法来完成的.完成后在Swing事件线程上调用此方法,允许您更新GUI或打印出一些内容或其他内容.如果你真的需要阻止它完成,你可以打电话get()
.
NB.get()
在done()
方法中调用将立即返回您的结果,因此您不必担心阻止任何UI工作.
调用get()
将导致SwingWorker
阻止.
来自Javadocs:
T get()
Waits if necessary for the computation to complete,
and then retrieves its result.
Run Code Online (Sandbox Code Playgroud)
您的代码将如下所示:
public static void main(String args[])
{
Test t = new Test();
t.doTask();
t.get(); // Will block
System.out.println("done");
}
Run Code Online (Sandbox Code Playgroud)
您可以覆盖done()方法,该方法在doInBackground()完成时调用.在EDT上调用done()方法.所以类似于:
@Override
protected void done() {
try {
super.get();
System.out.println("done");
//can call other gui update code here
} catch (Throwable t) {
//do something with the exception
}
}
Run Code Online (Sandbox Code Playgroud)
在done内部调用get()方法有助于恢复在doInBackground期间抛出的任何异常,因此我强烈推荐它.SwingWorker在内部使用Callable和Future来管理后台线程,您可能想要阅读它而不是尝试连接/收益方法.