說我有下面的代碼:如何等待SwingWorker的doInBackground()方法?
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也有一個覆蓋的功能,在後臺線程運行時更新GUI窗口。 get()
確實停止「完成」,直到doInBackground
之後,但是然後GUI不更新。我更新了我的示例代碼以反映這一點,雖然現在當然不會編譯。
有沒有辦法讓'完成'只打印一次doInBackground
完成? GUI更新代碼和「完成」語句在同一個線程上?我是否需要製作新的線程?
好吧,我用`done()`得到了它的工作。謝謝你的幫助。 – Max 2010-11-23 23:27:09
未來googlers的注意事項:當SwingWorker被取消時,這並沒有什麼幫助。 `done()`可以在`doInBackground()`完成之前運行。 :-(http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6826514 http:// stackoverflow。com/questions/6204141/swingworker-when-exactly-called-done-method – kmort 2015-01-27 21:50:38