我有幾個關於Swing和使用EDT進行GUI更新的問題。我剛開始閱讀這個東西,所以我在這方面是一個完整的初學者:Java Swing - 在EDT上運行
- 需要哪些操作在EDT上運行?如果他們不這樣做,簡直是一個異常提出?
- 有沒有什麼特定的時間,我們實際上在EDT自動?
- 如果我們使用
SingUtilities.invokeLater
安排任務,我們將它排入當前的GUI更新任務隊列嗎? - 對上述隊列的訪問我猜是同步的,或者使用了一些併發集合,但是如果我從兩個後臺線程安排兩個GUI更新任務,那麼不可能說哪一個會先被添加?例如,如果線程1首先提交將JLable的文本設置爲「是」的任務,然後短時間後,第二個線程出現並提交將該值設置爲「否」的任務,那麼我們是否保證結果將是「是」,還是僅僅是操作系統如何安排這些事情的問題?
SwingWorker如何確保
done()
方法在EDT上運行?它集下面的代碼:future = new FutureTask<T>(callable) { @Override protected void done() { doneEDT(); setState(StateValue.DONE); } };
所以我想知道是否FutureTask某種程度上確保了invokeLater
叫?
感謝您的答案。
兩個問題: 4.所以它是第一個執行後面調用的線程的權利?因此,OS可能會安排第二個後臺線程invokeLater調用FIRST,並且訂單會被搞亂? 5.我仍然沒有看到如何達到EDT。 do Submit將Runnable添加到AccumulativeRunnable ... –
Bober02
2012-08-06 09:19:03
@ Bober02請參閱由於使用Swing'Timer'而在EDT上執行的javax.swing.SwingWorker.DoSubmitAccumulativeRunnable runnable。對於4:是的,如果您想控制訂單,您必須確保您的一個後臺線程在其他線程安排其可運行之前安排可運行。 – Robin 2012-08-06 09:27:05
有時,提交給doSubmit()的所有內容都在EDT中運行。你不必關心它是如何以及在哪裏完成的:這個類已經過測試,並且按照記錄進行工作。 – 2012-08-06 09:28:47