對執行緒的一些理解

2021-08-31 18:59:54 字數 2039 閱讀 2727

先看一下面這段** 

package com.xwiam.threadprogram;

/** * @author xiwam

* @date 2018/11/10 11:12

* @desc

*/public class threadinterrupt implements runnable

public void test()

}public static void main(string args) throws exception

}class threadtest implements runnable

public void run()

}

這段**會列印什麼,如果你執行main()方法的話,會發現列印結果如下:

count = 2

count = 4

但是你多執行幾次main()方法的話,會發現列印結果可能如下:

count = 2
為什麼會出現這種情況呢?首先得了解下執行緒的生命週期。

執行緒從開始到結束有6種狀態。

new  state:新建乙個執行緒,這時候執行緒處於就緒狀態,run()方法中的**還沒有執行。

runnable state:執行緒可能已經在執行或者在等待執行。新建執行緒在呼叫start()方法後即進入執行緒排程的執行緒池中,狀態從新建狀態變成runnable狀態,每個處於runnable狀態的執行緒都需要執行緒排程器根據排程演算法進行排程分配執行時間。

blocked state:執行緒在等待monitor鎖,比如在進入synchronized塊或者方法之前需要獲取對應的物件鎖,如果這時物件鎖已經被其他執行緒獲取了,當前執行緒就只能阻塞在這兒,等待物件鎖被釋放然後再去競爭物件鎖。

waiting state:執行緒處於等待狀態,等待另乙個執行緒的action。執行緒進入等待狀態有三種情況:object.wait()、thread.join()、locksupport.spark()。其中thread.join(),如果看原始碼的話其實最終呼叫了object.wait(0),而obejct即thread物件,本質上和object.wait()一樣。

public final synchronized void join(long millis)

throws interruptedexception

if (millis == 0)

} else

wait(delay);

now = system.currenttimemillis() - base;}}

}

time waiting state:執行緒處於等待狀態直到超時、被喚醒或者被打斷。比如執行緒處於sleep狀態,另乙個執行緒呼叫interrupt()方法,會讓當前執行緒結束睡眠狀態,丟擲interruptedexception異常。

terminated state:執行緒run()方法執行完成,或者出現不能處理的異常,比如段錯誤。

了解完了執行緒的生命週期,回頭看這段**。這段**為什麼會出現第二種情況呢?首先,thread1對test執行緒有依賴,而test執行緒對thread有依賴,因而thread1間接地對thread有依賴。由於thread.run()方法執行的時間很短,所以thread1執行緒在執行run()方法時,很可能thread執行緒已經執行結束了,進入terminated state狀態。雖然thread1執行緒有對thread執行緒的引用,但是thread執行緒已經進入死亡狀態。看jdk原始碼的話,thread.run()會去判斷target欄位是否為null,由於thread執行緒已經進入死亡狀態,所以這時候target為null,run()方法將不會執行。count = 4 也就沒有列印出來。

public void run() 

}

多執行緒程式設計的話,對執行緒的生命週期一定要理解透徹,我還只是了解皮毛,並沒有深入到jvm中去,後續繼續深挖。

對執行緒安全的理解

方法中的變數不存在非執行緒安全問題,永遠都是執行緒安全的,這是因為方法內部的變數是私有的特性造成的。synchronized鎖加在方法上,鎖的是物件。效果同synchronized this synchronized加在靜態方法上,鎖的是類。效果同synchronized class.class 多...

對執行緒中斷,join,yield的理解

乙個執行緒在未正常結束之前,被強制終止是很危險的事情.因為它可能帶來完全預料不到的嚴重後果.所以你看到thread.suspend,thread.stop等方法都被deprecated了 那麼不能直接把乙個執行緒搞掛掉,但有時候又有必要讓乙個執行緒死掉,或者讓它結束某種等待的狀態 該怎麼辦呢?優雅的...

關於對執行緒的個人理解

此觀點建議與該部落格上進行編寫 在我們編寫程式的時候,會經常思考執行緒到底是什麼東西,下面請檢視如下的 要點 1 同一物件,啟用2個執行緒 new thread 物件,a new thread 物件,b 2 分別啟用a,b兩個執行緒,兩個物件 new thread a new thread b 觀點...