2014-03-03 54 views

回答

4

您正在創建一個Runnable接口的匿名實現的實例,並將其傳遞給invokeLater,該實例將其放入隊列中。另一個線程Event Dispatch Thread從該隊列中彈出Runnables,並調用它們的方法run。 (請注意,這確實是一個簡單解釋,不與現實對應100%)

在你作爲程序員感興趣的影響方面,這使得下面的代碼行:

chatWindow.append(text); 

不是在當前線程上執行,而是在事件調度線程(EDT)上執行。如果您嘗試在當前線程上執行它,則會導致未定義的行爲,因爲Swing不是線程安全的,所有GUI操作都必須在提及的EDT上進行。

+0

Thanks Dude!非常好的解釋 –

+0

你必須通過事件調度線程將文本附加到chatWindow,因爲Swing在單線程模型上工作。應該通過Event Dispatch Thread完成與UI有關的所有更新。 –

0

Runnable是Java中的一個接口,表示定義運行方法的類型。實現Runnable接口的類必須爲其提供實現。 Thread是一個衆所周知的Runnable。

docs

導致doRun.run()要在分派線程AWT事件 異步執行。在處理了所有待處理的AWT事件 之後,會發生這種情況。應用程序線程 需要更新GUI時應使用此方法。在以下示例中,invokeLater調用 會將事件調度 線程中的Runnable對象doHelloWorld排隊,然後打印消息。

如果invokeLater的是從事件派發線程調用 - 爲 例如,從JButton的ActionListener的 - 在doRun.run()仍將 被推遲,直到所有掛起事件被處理。

+0

我很困惑它是在一個新的線程中運行它還是在相同的。 –

+1

@namanjain: - 它將在Event Dispatch Thread上執行。它不會在當前線程上執行,而是在事件發送線程上執行 –

0

這是將一定數量的指令傳遞給AWT事件調度線程(EDT)的一種方法。這是必要的,因爲從其他線程操作AWT相關的東西(如JFrames和它的所有孩子)是不好的做法。你最好把它交給EDT,讓它在適當的時候處理它。

代碼本身使用實現Runnable的匿名類來讓您指定要在EDT上執行的操作。 Runnable接口要求您執行run()方法。然後,EDT會在需要時調用您的課程對象run()

0

雖然幾個很好的答案和解釋,在這裏這些鏈接,但我仍增加了一些細節:

Should we use EventQueue.invokeLater for any GUI update in a Java desktop application?

http://www.javamex.com/tutorials/threads/invokelater.shtml

Swing事件處理代碼上被稱爲事件一個特殊的線程運行調度線程(EDT)。大多數調用Swing方法的代碼也在這個線程上運行。這是必要的,因爲大多數Swing對象方法不是線程安全的。所有GUI相關的任務,任何更新都應該對GUI進行,而繪製過程必須在EDT上進行,這涉及將請求包裝在事件中並將其處理到EventQueue上。然後,這個事件從一個接一個的隊列中發出,以便它們進入第一個入口。也就是說,如果事件A被排入到EventQueue之前事件B,那麼事件B不能在事件A之前被指派

SwingUtilities類有兩個實用的功能,以幫助GUI渲染任務:

1)的invokeLater( Runnable):導致doRun.run()在AWT事件分派線程(EDT)上異步執行。如上所述,在處理完所有待處理的AWT事件之後將發生這種情況。

2)invokeAndWait(Runnable):它具有與invokeLater相同的功能,但它與invokeLater的區別在於: - > invokeAndWait等待它給EDT的任務,在返回前完成。 - 它阻塞(等待)當前(即,它正在調用線程繼續執行,通過同步鎖來發送到WAIT狀態。) - >它會在此函數發佈的事件請求發佈後釋放鎖被分派在EDT而這個函數的調用線程可以繼續。

0

這只是增加了一個任務的Java線程是負責渲染&事件的整個應用程序的任務隊列。

注意:此線程被稱爲EDT(Event Dispatching Thread)。

相關問題