標籤:繼承 sleep 速度 自己 生產者 sub shu 實現 已耗用時間
1.進程與線程:
線程:一個進程可以擁有多個並行的線程,線程是進程中一個程式執行控制的單元,一個進程中的線程會共用記憶體位址空間(因為線程所使用的資源是它所在進程的資源),所以訪問相同的變數和對象,所以進程內線程之間的資料也是共用的,且線程組的通訊是在同一地址空間上進行,所以不需要額外的通訊機制,使得傳遞的訊息速度更快,每個線程在棧裡面是獨立的,單個線程中程式是有序的,一個線程看另一個線程中程式是無序的 ,線程是基於進程的
進程:由cpu,data,code三部分組成,每個進程都是獨立的,由系統分配,進程間的切換開銷較大,進程基於作業系統;
2.並行與並發
並發:多個線程訪問同一份資源
並行:在多個cpu情形下,多個線程同時運行
3.線程數與已耗用時間
線程數:我們看到的虛擬機器裡面顯示的線程數,是虛擬線程數,例如單線程,他是將時間分成很多小的時間片,不同的時間片會調用不同的虛擬線程程式段,當調用這個程式是其他程式會掛起
已耗用時間:已耗用時間與實際的是線程數有直接聯絡,而且過多的線程容易引起並發等問題,所以不一定快
4.開啟線程的形式
Thread類:
步驟:
1>定義類繼承Thread類;
2>目的是複寫run方法,將要讓線程啟動並執行代碼都儲存到run方法中;
3>通過建立Thread類的子類對象,建立線程對象;
4>調用線程的start方法,開啟線程,並執行run方法。
Runnable介面
步驟:
1>定義類實現Runnable介面。
2>覆蓋介面中的run方法。
3>通過Thread類建立線程對象;
4>將實現了Runnable介面的子類對象作為實際參數傳遞給Thread類中的建構函式。
5>調用線程的start方法,開啟線程,並執行run方法。
Callable介面
步驟:
1>定義類實現callable介面。
2>覆蓋介面中的call方法。
3>建立一個可重用的固定線程池
4>將實現了callable介面的子類對象作為實際參數傳遞給submit類中的建構函式,開啟線程池所有線程
5>shutdown停止線程池的所有線程,也可以不採用shutdown,自訂停止線程
Callable 與runnable介面的區別
1>callable定義的是call方法,runnable定義的是run方法
2>callable可拋出異常,run方法不可拋出異常
3>callable有傳回值,runnable沒有傳回值
5. 線程在運行過程中的狀態
1> 新生狀態:new一個thread類或者其子類之後,就處於新生狀態
2> 就緒狀態:線程start後,就處於就緒狀態
3> 運行狀態:運行run方法中的代碼,直到調用完成,或者調用其他方法而停止
4> 阻塞狀態:處於啟動並執行線程在遇到某些情況後會停止自己的運行,進入阻塞狀態,下次運行時會回到停止的狀態接著運行(如sleep,jion,io等)
5> 死亡狀態:被強制終止(如stop,destroy等),或者運行完成
6. 線程停止的方式
Thread的stop及destroy Api已經標明已淘汰,所有多用自己定義的線程停止,啟動線程停止後,線程是在一定的延時後最終停止
7. 線程中常用的一些方法
1> isAlive 線程是否還存活
2> currentThread 返回當前線程地址
3> setName 設定名稱
4> getName 擷取該線程名稱
5> currentThread. getName擷取當前線程名稱
6> setpriority 設定優先權,指的是機率而不是運行順序
7> sleep 線程休眠,不會釋放鎖
8> wait (Object方法)暫停該線程,會釋放鎖
9> notify (Object方法)喚醒該對象下的單個線程
10> notifyAll (Object方法)喚醒所有該對象下的線程
8. 同步
添加同步的原因:多個線程訪問同一份資源,為了確保這份資源的安全所以加入了同步,
過多的同步可能會造成死結,因為都不肯釋放資源。
9. 常用解決死結的方法
1> 消費者生產者思想法:加入一個標誌位,使生產時就不能消費,消費時就不能生產
2> Timer類來實現等
基礎篇之多線程總結