天天看點

Java基礎知識回顧--線程

基本概念

線程是一個程式内部的順序控制流

java的線程是通過java.lang.thread類來實作的。main函數是一個主線程,使用者可以通過建立thread的執行個體來建立新的線程。每一個線程都必須實作run方法。通過thread類的start方法來啟動一個線程。

兩種方式實作,一種是線程類實作runnable接口;二種就是定義一個thread的子類并重寫其run方法。

以下是幾個線程控制的基本方法

Java基礎知識回顧--線程

用stop或者其他方法直接切斷線程是很暴力的是很不好的,這裡介紹一種比較好的結束線程的辦法。巧妙的用到一個flag。

線程同步

線程同步這個問題很重要,會衍生很多鎖的問題。也是兩種方式上鎖,一種是直接在方法上上鎖,另一種就是鎖對象。

死鎖

假如兩個線程都需要兩個資源才能完成,a線程把a資源鎖定等待b資源,b線程把b資源鎖定等待a資源。這樣就會形成死鎖,是以我們要把鎖定義到最大化就是鎖定整個對象,就是專業術語說鎖的粒度要盡量大。

這個程式段輸出的結果是

2000

b = 2000

這段程式也是先進的m2。

這段代碼輸出的結果是

1

2

b = 1000

這一段代碼執行結果是

1000

鎖是鎖住了,但是tt那個線程執行的快一些,先進入了m2。

是以說線程同步是一個很複雜的問題,我們得仔細推敲。而且我個人覺得跟電腦的運作速度還是有關系的。其他線程可以自由通路沒有加同步的任何方法,并且會産生資料不一緻的現象。如果要保護好某一類的同步對象,必須要對該對象所有的方法考慮加不加同步,加了同步很有可能效率會變低,不加同步很有可能造成資料不一緻的現象。

優先級

我的了解就是cpu優先讓哪個線程執行嘛,比較單cpu其實是假的多線程,就是因為cpu運算速度比較快,是以就一個線程讓你執行一下,就像是多線程在執行一樣。

生産者與消費者問題【經典問題】