為求速成,只好求助官方教學檔Concurrency in Swing,後續的內容都是從官方教學中精減出來,主要是快速讓自己能對Java 多執行緒有基本的瞭解。
1、Swing多執行緒
一個Swing程式,包含3種執行緖。一個是Initial threads(初始執行緖),用於執行應用程式一開始的程式碼。另外一個是event dispatch thread(EDT)(事件分派執行緖),所有事件處理的程式碼都是這個執行緖執行,大多數和Swing框架互動的程式碼也是有這個執行緖所執行。再來是Worker thread(工人執行緖)也稱為background thread(背景執行緖),比較耗時的背景工作都由這個執行緖執行。程式設計師並不需要提供程式碼明確的建立這些執行緖,它們由Swing框架或執行時期容器所提供,程式設計師只需要使用這些執行緖建立互動及可維護的Swing應用程式。
2、初始執行緖
每個應用程式一開始都會有一組初始的執行緒,對於普通Java程式,只有一個初始執行緒,用於執行main()方法,對於applet而言,初始執行緒會建立applet物件並呼叫init()和start()方法,這些初始執行緒可能是一個也可能是多個,要視Java執行時期容器的實作而定。對於Swing應用程式,初始執行緖最基本的工作是建立一個Runable物件,這個物件用於初始化GUI,並排程由EDT所執行的物件。一但GUI建立後,應用程式主要由GUI事件驅動,這些事件是由EDT所執行的短暫工作,應用程式可以排程EDT所執行的工作,由EDT所執行的工作應該是越短越好,也可以執行較長的工作,也就是工人執行緖。
初始執行緖透過javax.swing.SwingUtilities.invokeLater() 或 javax.swing.SwingUtilities.invokeAndWait()等2個方法,處理建立GUI的工作,這2個方法都只有一個參數,一個Runnable物件,這個2方法的不同處是,invokeLater()只排程工作然後就返回(return),而invokeAndWait()會等到工作完成再返回。
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
對於applet而言,GUI的工作是由init()方法透過invokeAndWait()所建立,如果不這樣做,init()可能會在GUI建立之前返回,會造成瀏覽器啟動applet會有問題,而對於一般的GUI程式,建立GUI物件通常是初始執行緖所執行的唯一工作,所以使用invokeLater()或invokeAndWait()都可以。
為什麼初始執行緖只建立GUI物件,因為所有建立及與Swing元件互動的程式碼都是透過EDT所執行,這是很重要的限制。
沒有留言:
張貼留言