概述
瀏覽網頁時,當你等待載入圖片時可以閱讀和滾動網頁中的文本,這種方式不好嗎?在文書處理軟體中,當你開啟另一個需要編輯的文檔時,可以讓一個文檔在後台列印又如何呢?也許你已經享受了在回複一封email同時又能下載帶有大檔案附件的好處。通過允許一個多線程程式在同一時間做多個任務就可以使得這些方便的功能成為可能。這本書可以協助你學習這些必須的技巧並把此有用的功能與你的JAVA程式相結合。
什麼是線程(What Is a Thread)
當現代作業系統想開始運行一個程式,它首先建立一個進程(Process)。進程是一個當前正在執行的程式。每個進程至少有一個正在啟動並執行線程(Thread)。有時,線程也被認為是輕量級進程(lightweight process)。一個線程是程式的一個代碼執行路徑(a path of code execution),每個線程有屬於自己的局部變數,程式計數器(指向正在執行的指令)和生命週期。許多現代作業系統允許在一個處理器中同時運行多個線程。當作業系統啟動了JVM(Java虛擬機器)之後,就建立了一個新進程。在此進程中可建立許多線程。
通常,JAVA代碼的執行從main()方法開始,然後沿著程式的路徑進行處理直到main()方法中的所有陳述式完成。這就是一個單線程(single thread)的例子。這個“main”線程由JVM來建立,然後該線程開始執行main()方法,執行main()中所有語句,最後當main()完成後,該線程就會死掉(die)。
JVM中第二個總在啟動並執行線程是:記憶體回收線程(garbage collection thread)。該線程清除掉所有遺棄的對象並回收它們的記憶體。所以,即使一個把“hello world”輸出到System.out的簡單JAVA程式也正運行在多線程的環境中。其中包括兩個線程,一個是主線程(main Thread),另一個為記憶體回收線程。
當一個JAVA程式包含了圖形化使用者介面(GUI)時,JVM會自動啟動多個線程。其中一個線程負責把GUI事件傳遞給程式中相應的方法,另外線程負責畫GUI視窗。
例如,一個基於GUI程式的主線程負責完成一個複雜、長時間的計算。當該計算進行中時,使用者點擊了“停止計算”按鈕,此時GUI事件線程就會調用為此按鈕寫的事件處理代碼來終止計算線程。試想,如果只有一個線程,二者(計算和終止計算)不可能同時進行,中斷計算將是困難的。