線程的創建
*繼承Tread,重寫run
*實現Runnable接口,重寫run() [匿名內部類]
*實現callable接口(有結果返回)
線程的常用方法
調用join保證這個方法先執行完成,
線程安全
并發編程
進程:就相當一個程序的實例
線程:就是指令流(一個進程包含多個線程)
并發:同一時間。一個cpu輪流執行
并行:兩cup同時工作
lamda簡化匿名內部類的寫法
JVM:堆,棧,方法區
棧:是線程用的,(后進先出)(執行完就會釋放)
? ? ? ? *有多個棧幀組成,對應著每次方法調用時所占的內存
? ? ? ? *每個線程只能有一個活動棧幀,對應正在執行的方法
? ? ? ? 遞歸會導致棧溢出
一個線程一個棧,一個方法一個棧幀
棧和棧幀
程序啟動 在jvm的加載機制
1,將代碼加載到 方法區(類加載)
2,棧啟動mian主線程:? 然后給線程的方法分配棧幀
new出來的對象放堆,方法執行完棧幀就會釋放
線程的棧幀是獨立的(程序計數器記錄每個線程的執行到哪里-記錄當前線程的狀態)
操作系統的任務調度器 分配時間片
上下文切換
讓出cpu的時候
程序計數器d記錄當前線程的狀態等信息(局部變量,等)
頻繁的切換會影響性能
常見方法
start() 線程進入就緒狀態? ?不能多次啟動 會報錯
run 新線程啟動后會調用
join 等待線程運行結束
優先級(1-10)默認5-(cup空閑的時候 幾乎沒有用)
getStatus
isAlive
線程的狀態有哪些5種
1,new
2,runnable就緒(
3,running運行
4 阻塞
5,Terminated終止
java線程的狀態有哪些6種
1,new
2,runnable就緒()運行中的
3,blocked?阻塞(synchronize)
4,Waiting 等待-要喚醒 (join)
5,Timed Waiting?計時等待 -阻塞(sleep)
6,Terminated終止
sleep:
*調用會 計時等待(線程狀態:runing變Timed Waiting(阻塞)讓出cup):類似于等待狀態
*通過其他線程調用interrupted(),打斷睡眠(會拋interrupted異常)
*睡眠結束后 未必立即執行(讓出cup)
*TimeUnit的sleep可讀性更好 可以替換thread的sleep
*阻塞線程
yield:
*調用會 計時等待(線程狀態:runing變runable(就緒))讓出cup 如果沒有其他操作還是會執行
*讓給優先級高的,
*不阻塞線程
join
*等待線程運行結束-達到同步的目的,
*阻塞線程
join(long tim)最多等待
interrupt 打斷
打斷阻塞的線程 例如 sleep,wait,join
異常打斷:(打斷標記 flose)例如程序在執行sleep的時候? 清除標記
正常常打斷:(打斷標記 true)
isinterrupt ?不會清除標記
park 停止
打斷標記為真的時候 失效
守護線程
*正常:java要等待所有線程結束才會結束,(不然主線程結束 子線程一樣執行)
*如果非守護線程都結束,守護線程也強制結束(如果子線程是守護線程,主線程結束他也結束)
-垃圾回收就是守護線程
共享模型
synchronize工作
*monitor(監控系統提高的)重量級鎖
*輕量級鎖(翻書包看看是誰的)
*偏向鎖(寫上名字)可以批量修改重偏向
每一次都可能向上升級
輕量級鎖:(如果有競爭會升級為重量級) 棧幀是對輕量級鎖的實現
*訪問時間是錯開的
????????鎖膨脹:就是嘗試加輕量級鎖失敗,升級為重量鎖
重入鎖:就是同一個對象再次如鎖+1