從EDT(Event Dispatcher Thread)啓動新線程時,新線程永遠不會是EDT,因爲只有一個EDT,對嗎?我問,因爲我看到一些代碼檢查if (!SwingUtils.isDispatcherThread())
,我不知道爲什麼需要這個檢查?EDT,異步,同步
我的問題是:什麼時候啓動一個新線程,它是同步的(必須等待新線程完成)還是異步(新線程立即返回)?相應的如何啓動一個同步或異步的線程?
以下列爲例。在EDT中啓動非EDT線程時,如下所示:
public void actionPerformed(final ActionEvent e)
{
final Runnable runnable = new Runnable()
{
@Override
public void run()
{
//do some non-gui task. The task is not long-running, but
//could be blocked
doTask();
}
};
new Thread(runnable).start();
}
});
非EDT線程是從EDT產生的同步還是異步?如果doTask()
掛起,EDT UI應該被阻止?
如果我無法控制doTask()
並且該方法無法更改,那麼處理產生新線程和新線程可能會掛起的情況的好方法是什麼?在父線程中使用Thread.join()
?
謝謝!只想確認: – user3014901
謝謝!只是想確認一下:(1)你的意思是一個新的Thread.start()默認情況下總是立即返回父線程?或者它取決於?通過併發,你的意思是父線程和新線程有相同的機會被安排運行,並且它們被隨機調度運行? (2)我的期望是如果產卵的非EDT線程掛起,EDT線程就會運行。這不可行嗎? – user3014901
1.是的。是的。 2.如果任何其他線程掛起,EDT線程將繼續運行。他們同時運行。 –