【发布时间】:2011-05-14 18:48:24
【问题描述】:
假设我有以下代码:
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");
}
}
我需要等到t.doTask() 完成后才能打印出“完成”,但我不确定具体如何操作。我知道我可能应该在这里使用join(),但是我需要一个线程来调用它,而且我不知道如何从我需要调用join() 的地方获取doInBackground() 的线程。感谢您的帮助。
编辑:感谢您的回复。不幸的是,get() 等并不能完全解决问题。在我的实际代码中,SwingWorker 还有一个被覆盖的process() 函数,它在后台线程运行时更新GUI 窗口。 get() 确实停止打印“完成”,直到 doInBackground 之后,但随后 GUI 不会更新。我更新了我的示例代码以反映这一点,尽管现在它当然不会编译。
有没有办法在doInBackground 完成后才“完成”打印? GUI 更新代码和“完成”语句是否在同一个线程上?我需要创建一个新线程吗?
【问题讨论】:
标签: java swing synchronization swingworker