2017-02-28 51 views
0

我讀的Java concuremcy在實踐中看起來「主事件循環。現在我達到了9.1章。但我沒有在Java上開發GUI應用程序。從本書如何在傳統的Java應用程序[JCIP 9.1]

報價:

爲什麼圖形用戶界面單線程?

在過去,GUI應用程序是單線程和GUI事件 從一個「主事件循環」進行處理。現代圖形用戶界面框架使用僅略有不同的 模型:它們創建用於處理GUI事件的專用事件 調度線程(EDT)。

我以前不是開發人員,因此我不明白GUI應用程序中的「主事件循環」是什麼意思。谷歌也沒有迴應我明確的解釋。

,你能否告訴例如這一傳統技術的?是否有生產和消費任務的隊列?

回答

1

是的,在這兩種情況下,其中任務等待處理隊列中,以及執行的線程任務一個接一個。

主事件循環裝置的專用螺紋,其在一個循環中,處理該應用程序的所有任務,既涉及到UI和如I/O和數值計算應用程序的所有其他方面。 這個編程模型很方便,因爲它是單線程的,它不需要線程同步。無論如何,在過去的時代,電腦只有一個CPU,多線程並不會產生太大的影響。

如今,事件調度線程(EDT)僅處理UI請求,允許I/O和以並行方式運行的數值計算。一般來說,這需要線程同步,但與EDT通信仍然很簡單:

SwingUtilities.invokeLater(new Runnable() { 
    @Override 
    public void run() { 
    //Code to change Swing data. 
    } 
}); 

您仍然可以使用EDT的應用程序的所有任務,不僅UI,如果您的應用程序是重量輕,超載EDT會不會讓UI變慢。

+0

** invokeLater **與EDT並行調用? – gstackoverflow

+0

是的,invokeLater(任務)可以從任何線程調用。此方法只是將任務發佈到EDT事件隊列。 EDT從該隊列中逐一獲取任務並調用task.run()。 –

+0

@gstackoverflow'invokeLater'用於在* EDT上運行*所有與用戶界面的交互必須從EDT發生。您可以從與EDT並行運行的線程中調用'invokeLater',將一些工作委託給它。 –

相關問題