概念:
線程是一個程序內部的順序控制流
線程和進程的比較:
每個進程都有獨立的代碼和數據空間(進程上下文),進程切換的開銷大。
線程:輕量的進程,同一類線程共享代碼和數據空間,每個線程有獨立的運行棧和程序計數器(PC),線程切換的開銷小
多進程:在操作系統中能同時運行多個任務(程序)
多線程:在同一應用程序中有多個順序流同時執行
線程的概念模型
1. 虛擬的CPU,由java.lang.Thred類封裝和虛擬;
2. CPU所執行的代碼,傳遞給Thread類對象;
3. CPU所處理的數據,傳遞給Thread類對象;
創建線程的兩種方式:實現Runnable接口,繼承Thread類
比較:
實現Runnable接口
可以將CPU,代碼和數據分開,形成清晰的模型;
線程體run()方法所在的類還可以從其他類繼承一些有用的屬性和方法
有利於保持程序風格的一致性
繼承Thread類
Thread子類無法再從其他類繼承
編寫簡單,run()方法的當前對象就是線程對象,可直接操縱
當一個程序的用戶線程全部結束后,即使后台線程的邏輯處理未結束,后台線程也會結束。
線程生命周期:
新建
就緒
運行
阻塞
終止
線程優先級:
默認為5,最小為1,最大為10,不提供優先級低的在優先級高的執行結束后執行
線程串行化
join()
線程休眠
sleep()
線程讓步
yield() 時間片沒用完就讓步給其他線程盡早執行,當前線程進入就緒狀態
線程的掛起和恢復
線程掛起-暫時停止當前運行中的線程,使之轉入阻塞狀態,並且不會自動恢復運行。
線程恢復-使得一個已掛起的線程恢復運行
suspend()
resume()
臨界資源問題
並發線程有機的交替,確保共享的數據在關鍵的時段被專用
多個線程間共享的數據稱為臨界資源
在Java語言中,引入了對象互斥鎖的概念,來保證共享數據操作的完整性
每個對象都對應於一個可稱為“互斥鎖”的標記,這個標記用來保證在任何一個時刻,只能有一個線程訪問該對象
關鍵字synchronized來與對象的互斥鎖聯系。當某個對象用synchronized修飾時,表明該對象在任一時刻只能有一個線程訪問
並發運行的多個線程彼此間等待,都無法運行的狀態稱為線程死鎖
線程同步通信
為避免死鎖,在線程進入阻塞狀態時應盡量釋放其鎖定的資源,以為其他的線程提供運行的機會
wait()
notify()/notifyAll()
線程間數據傳輸
使用管道流
類的同步性與線程安全


