java多線程

參考文章

如何創(chuàng)建并運行java線程 | 并發(fā)編程網(wǎng) – ifeve.com

(此文摘取了其中一些知識點,具體知識點及源碼請于鏈接處觀看)

創(chuàng)建并運行java線程

1.創(chuàng)建Thread的子類

注意

一旦線程啟動后start方法就會立即返回,而不會等待到run方法執(zhí)行完畢才返回。就好像run方法是在另外一個cpu上執(zhí)行一樣。

2.實現(xiàn)Runnable接口

為了使線程能夠執(zhí)行run()方法,需要在Thread類的構(gòu)造函數(shù)中傳入?MyRunnable的實例對象。示例如下:

Thread thread = new Thread(new MyRunnable());

thread.start();

3.創(chuàng)建子類還是實現(xiàn)Runnable接口?

線程池可以有效的管理實現(xiàn)了Runnable接口的線程,如果線程池滿了,新的線程就會排隊等候執(zhí)行,直到線程池空閑出來為止。而如果線程是通過實現(xiàn)Thread子類實現(xiàn)的,這將會復(fù)雜一些

4.常見錯誤:調(diào)用run()方法而非start()方法

事實上,run()方法并非是由剛創(chuàng)建的新線程所執(zhí)行的,而是被創(chuàng)建新線程的當(dāng)前線程所執(zhí)行了。也就是被執(zhí)行上面兩行代碼的線程所執(zhí)行的。想要讓創(chuàng)建的新線程執(zhí)行run()方法,必須調(diào)用新線程的start方法。

5.獲取線程名

Thread子類:調(diào)用getName()

Runnable的實現(xiàn)類

線程安全與共享資源

允許被多個線程同時執(zhí)行的代碼稱作線程安全的代碼。線程安全的代碼不包含競態(tài)條件。當(dāng)多個線程同時更新共享資源時會引發(fā)競態(tài)條件。

1.局部變量和對象

局部變量存儲在線程自己的棧中。也就是說,局部變量永遠(yuǎn)也不會被多個線程共享

2.局部對象的引用

所有的對象都存在共享堆中。如果在某個方法中創(chuàng)建的對象不會逃逸出(譯者注:即該對象不會被其它方法獲得,也不會被非局部變量引用到)該方法,那么它就是線程安全的。實際上,哪怕將這個對象作為參數(shù)傳給其它方法,只要別的線程獲取不到這個對象,那它仍是線程安全的。

public void someMethod(){


? LocalObject localObject = new LocalObject();

? localObject.callMethod();

? method2(localObject);

}

public void method2(LocalObject localObject){

? localObject.setValue("value");

}

樣例中LocalObject對象沒有被方法返回,也沒有被傳遞給someMethod()方法外的對象。每個執(zhí)行someMethod()的線程都會創(chuàng)建自己的LocalObject對象,并賦值給localObject引用。因此,這里的LocalObject是線程安全的。事實上,整個someMethod()都是線程安全的。即使將LocalObject作為參數(shù)傳給同一個類的其它方法或其它類的方法時,它仍然是線程安全的。當(dāng)然,如果LocalObject通過某些方法被傳給了別的線程,那它就不再是線程安全的了。

線程控制逃逸規(guī)則

如果一個資源的創(chuàng)建,使用,銷毀都在同一個線程內(nèi)完成,

且永遠(yuǎn)不會脫離該線程的控制,則該資源的使用就是線程安全的。

資源可以是對象,數(shù)組,文件,數(shù)據(jù)庫連接,套接字等等。Java中你無需主動銷毀對象,所以“銷毀”指不再有引用指向?qū)ο蟆?/p>

即使對象本身線程安全,但如果該對象中包含其他資源(文件,數(shù)據(jù)庫連接),整個應(yīng)用也許就不再是線程安全的了。比如2個線程都創(chuàng)建了各自的數(shù)據(jù)庫連接,每個連接自身是線程安全的,但它們所連接到的同一個數(shù)據(jù)庫也許不是線程安全的。比如,2個線程執(zhí)行如下代碼:

????檢查記錄X是否存在,如果不存在,插入X

如果兩個線程同時執(zhí)行,而且碰巧檢查的是同一個記錄,那么兩個線程最終可能都插入了記錄:

線程1檢查記錄X是否存在。檢查結(jié)果:不存在

線程2檢查記錄X是否存在。檢查結(jié)果:不存在

線程1插入記錄X

線程2插入記錄X

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容