線程相關的Demo
一:多線程的兩種方式
1.線程與進程
進程是一個執行的程序
線程則是屬於進程的一個控制單元。
2.多線程的第一種方式
繼承Thewad類。
run的作用:多線程存儲程序的地方
start的作用:開啓線程,同時,調用run方法。
3.第一種方式的線程程序
4.第二種方式,實現接口
.
5.兩種方式的比較
第二種方式:避免了單繼承的侷限性。
兩種方式的線程代碼存放位置不同:
繼承Thread的線程代碼放在Thread的子類run的方法中。
實現Runnable,線程代碼存在接口的子類的run方法中。
二:多線程的安全問題
6.同步代碼塊
7.同步函數
使用的鎖是this。
8. 使用同步函數實現賣票程序
需要把要同步的代碼另外移植到一個函數中,因爲,直接在函數上同步上,while不會跳出來,就是說一個線程一直運行到底。
9.靜態同步函數的鎖
靜態進入內存後,內存沒有本類對象,但是一定該類對應的字節碼文件對象
類名.class。
10.懶漢式單例模式下的線程安全
11.死鎖程序
兩個鎖互相鎖。
三:通訊
12.單線程間通訊
13.單線程間通訊的優化
一些方法可以放在Resource中。
14.多線程間多通訊
多生產者消費者問題中(既該案例),一開始對用while還是if概念比較模糊,經過分析後總結如下: while進入一個線程之後執行wait(100),立刻釋放鎖,接着其它線程執行set或者out,如果執行了out,那麼當前線程則會跳出循環(out會將flag改爲false跳出循環),執行後續代碼。 if 進入一個線程之後執行wait(100),立刻釋放鎖,接着其它線程執行set或者out,如果執行了out,那麼等當前線程(假設爲A)wait之後的下一個線程進入set再經過判斷才能執行後面的代碼。 如果當時wait的線程(A線程)再次被啓動會接着當時的代碼繼續執行,這樣導致生產者會生產多次數據在消費者還未消費的情況下。
15.同步的lock鎖的使用
16.守護進程
主進程結束後,其他前程也跟着結束
17.停止進程
18.join方法。