我有一個工作線程應該等待EDT更新GUI才能繼續執行。我用發佈方法告訴美國東部時間改變一些東西。我如何讓工人等待這種變化發生?Java swing工作線程等待EDT
5
A
回答
4
如果它也正在啓動GUI改變你同樣的工作線程,那麼就等待,不能進行這些變化的準備建造的機制:
SwingUtilities.invokeAndWait()
應該很好地適應該法案。
另一種替代方法是使用SwingUtilities.invokeLater()爲EDT提供一些運行代碼,一旦EDT變爲空閒狀態,即它開始執行此任務時,它將喚醒您的線程。這包括立即觸發invokeLater()
,緊接着是wait()
,並希望在執行wait()
之前從EDI中喚醒。不過,這在時間上並不十分安全。
5
我假設你正在使用SwingWorker發佈你的結果。您可以使用布爾標誌來指示該值已被處理。在發佈中間結果之前,該標誌被清除,然後用於阻塞線程直到它被設置。 UI線程在完成處理髮布的數據時設置該標誌。
class MyWorker extends SwingWorker<K,V>
{
boolean processed = true;
protected void doInBackground() {
for (;;) {
setProcessed(false);
publish(results);
waitProcessed(true);
}
}
synchronized void waitProcessed(boolean b) {
while (processed!=b) {
wait();
}
// catch interrupted exception etc.
}
synchronized void setProcessed(boolean b) {
processed = b;
notifyAll();
}
protected void process(List<V> results) {
doStuff();
setProcessed(true);
}
}
+0
謝謝你的回答。我選擇了Carl Smotricz的方法,因爲它在我的情況下更有意義,我完全忘記了invokeAndWait。但是你所建議的方法仍然很有用。 – Mihaela 2010-07-04 09:50:29
相關問題
- 1. 強制EDT線程用於Swing庫
- 2. 等待所有工作線程結束
- 3. Java等待線程完成
- 4. Java Swing - 在EDT上運行
- 5. Java Swing TableModel fireTableRows插入EDT
- 6. Java多線程等待線程完成
- 7. iOS線程等待操作
- 8. Scala Swing等待
- 9. 等待工作不等待
- 10. 等待線程
- 11. Java Swing +線程
- 12. 讓線程等待
- 13. 多線程 - 等待線程
- 14. java swing swing與多線程
- 15. 等待的線程
- 16. 如何等待EDT的結果?
- 17. Java:等待線程異常通知
- 18. Java線程等待並通知
- 19. Java - 無法通知等待線程?
- 20. Java的等待 - 爲多線程問題
- 21. 在java中喚醒等待線程
- 22. java等待池中的所有線程
- 23. Java Swing線程庫
- 24. 多線程Java Swing
- 25. 是否允許在非EDT線程中加載Swing類?
- 26. tomcat:等待條件線程
- 27. Java的等待兩個線程通知作爲同一類
- 28. 等待Java線程池中的線程子集
- 29. Java線程調度:比處理器更忙的等待線程?
- 30. 多線程的Java如何讓線程等待一段時間
你的意思是像一個'暫停'按鈕? – trashgod 2010-07-03 22:17:34
聽起來像是想嘗試一件非常糟糕的事情。 – 2010-07-03 22:53:23