執行緒是指進程中的一個執行流程,一個行程可以運行多個執行緒。例如java.exe進程可以運行很多執行緒。執行緒總是輸入某個進程,進程中的多個執行緒共享進程的記憶體。
Java中執行緒是指java.lang.Thread類別的一個實例或執行緒的執行。使用java.lang.Thread或java.lang.Runnable介面編寫程式碼定義、實例化、啟動新執行緒。 (建議學習:java課程)
Java中每個執行緒都有一個呼叫堆疊,即使不在程式中建立任何新的執行緒,執行緒也在後台運行。 main()方法運行在一個執行緒內,稱為主執行緒。一旦建立一個新的線程,就產生一個新的呼叫棧。
執行緒分為兩類:使用者執行緒與守候執行緒。當所有使用者執行緒執行完畢後,JVM自動關閉。但是守候線程卻不獨立與JVM,守候線程一般是有作業系統或使用者自己創建的。
線程為我們帶來的好處
如果能合理地使用線程,將會減少開發和維護成本,甚至可以改善複雜應用程式的效能。如在GUI應用程式中,也以透過執行緒的非同步特性來更好地處理事件;在應用程式伺服器程式中可以透過建立多個執行緒來處理客戶端的請求。
執行緒甚至可以簡化虛擬機器的實現,如Java虛擬機器(JVM)的垃圾回收器(garbage collector)通常運行在一個或多個執行緒中。因此,使用執行緒將會從以下五個面向來改善我們的應用程式:
1. 充分利用CPU資源
現在世界上大多數電腦只有一塊CPU。因此,充分利用CPU資源顯得格外重要。當執行單執行緒程式時,由於在程式發生阻塞時CPU可能會處於空閒狀態。這將造成大量的計算資源的浪費。
而在程式中使用多執行緒可以在某一個執行緒處於休眠或阻塞時,而CPU又恰好處於空閒狀態時來執行其他的執行緒。這樣CPU就很難有空閒的時候。因此,CPU資源就被充分利用了。
2. 簡化程式設計模型
如果程式只完成一項任務,那就只要寫一個單執行緒的程序,並且按著執行這個任務的步驟編寫程式碼即可。但要完成多項任務,如果還使用單執行緒的話,那就得在程式中判斷每項任務是否應該執行以及何時執行。如顯示一個時鐘的時、分、秒三個指針。
使用單線程就得在循環中逐一判斷這三個指針的轉動時間和角度。如果使用三個線程分另來處理這三個指標的顯示,那麼對於每個線程來說就是指行一個單獨的任務。這樣有助於開發人員對程式的理解與維護。
3. 簡化非同步事件的處理
當一個伺服器應用程式在接收不同的客戶端連接時最簡單地處理方法就是為每個客戶端連接建立一個線程。然後監聽線程仍然負責監聽來自客戶端的請求。
如果這種應用程式採用單執行緒來處理,當監聽執行緒接收到一個客戶端請求後,開始讀取客戶端發送的數據,在讀完資料後,read方法處於阻塞狀態,也就是說,這個線程將無法再監聽客戶端請求了。
而要想在單執行緒中處理多個客戶端請求,就必須使用非阻塞的Socket連線和非同步I/O。但使用非同步I/O方式比使用同步I/O更難控制,也更容易出錯。因此,使用多執行緒和同步I/O可以更容易處理類似多請求的非同步事件。
4. 讓GUI更有效率
使用單一執行緒來處理GUI事件時,必須使用循環來掃描隨時可能發生的GUI事件進行掃描,在循環內部除了掃描GUI事件外,還得來執行其他的程式碼。如果這些程式碼太長,那麼GUI事件就會被“凍結”,直到這些程式碼被執行完為止。
在現代的GUI框架(如SWING、AWT和SWT)中都使用了一個單獨的事件分派線程(event dispatch thread,EDT)來掃描GUI事件。當我們按下一個按鈕時,按鈕的點選事件函數會在這個事件分派執行緒中被呼叫。
由於EDT的任務只是對GUI事件進行掃描,因此,這種方式對事件的反映是非常快的。
5. 節約成本
#提高程式的執行效率一般有三種方法:
(1)增加電腦的CPU個數。
(2)為一個程式啟動多個行程
(3)在程式中使用多執行緒。
以上是java的線程是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!