2013-12-08 135 views
1

我剛剛通過Java課程,並在我們通過多線程前幾周解釋當兩個(或更多)線程使用同一個對象時,對象必須是鎖定在除了使用它的那個線程外的所有線程上。兩條線程寫入相同的JTextArea

擁有一個GUI我想從2個線程寫入一些數據到一個JTextArea我應該在一個線程寫入時鎖定對象還是已經由JTextArea處理?如果我應該打擾一下,我該如何去做,因爲我不能在JTextArea類定義中聲明Lock?如果我不打擾這件事,它是否與所有的搖擺物體保持一致,如果不是,有什麼例外?

+0

[檢查此答案](http://stackoverflow.com/questions/2899682/unresponsive-threading-involving-swing-and-awt-eventqueue/20359861#20359861)在那裏我把關於GUI渲染的討論任務使用'SwingUtilites'將GUI渲染任務提交給在Event(事件分派線程)中執行的'EventQueue'。如果在文本出現之前需要關係時發生,則可以將此調用代碼放入同步函數中,但必須按照描述進行度量。 – Sage

回答

3

Swing本質上不是線程安全的,因此您無法做到這一點 - 您必須通過在SwingUtilities.invokeLater()中完成呼叫來更新來自EDT的所有GUI組件。例如:

SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     textArea.setText("Blah"); 
    } 
}); 

雖然有技術上的例外有幾個選擇組件,我仍是目前更願意在美國東部時間執行一切,除非有一個很好的理由,否則(非常非常罕見的案例)。

+0

你能解釋一下怎麼樣和\或爲什麼包裝做的伎倆?我看不出如何將這與我以前的多線程知識相匹配。 –

+0

包裝是否與'.setText'方法相關,也就是說,如果在我的情況下'run()'調用另一個實際上寫入的方法,我仍然應該包裝'run()'或涉及實際寫入目的? –

+3

這個包裝不會立即執行你在當前線程的'run()'方法中放置的任何東西,而是在事件派發線程上執行隊列(一個線程專用於執行與GUI組件相關的所有方法)。 「當前線程,現在就做這個」你在說「嘿,安全地執行GUI內容的線程,當你下一次可以自由地執行某些操作時調用這個方法」 – berry120

3

在Swing中,您必須僅從UI線程更新GUI組件。所以你必須安排你的線程的這些更新在UI線程上執行。

This is one exampleSwingUtilities.invokeLater()

相關問題