針對社群版本的IEDA建立springboot沒有springinitializr快速建立工具
阿新 • • 發佈:2020-10-18
程式 可以理解為靜態程式碼
程序 正在進行的程式 靜態的程式碼 執行起來
執行緒 正在執行程式中的小單元
1.主執行緒 系統執行緒
2.使用者執行緒 main
3.守護執行緒 gc(跟隨系統執行緒)
執行緒------------作業系統級別 cpu
如何在java中建立執行緒 讓執行緒執行 多執行緒
執行緒的狀態
ne start( cpu分配run() wait() exception/over 建立執行緒---就緒狀態--執行狀----等待/掛起-------異常/消亡 | | | | |_______________________________| notify(喚醒)/notifyAll(喚醒所有)
實現執行緒的過程
方法一:(存在問題:單繼承,子類繼承父類時,無法再繼承執行緒)
1.自己描述一個類
2.繼承父類的Thread
3.重寫run方法
4.new一個執行緒隊形 呼叫start() 讓執行緒進入就緒狀態
方法二:
1.自己描述一個類
2.實現一個父介面Runnable
3.重寫run方法
4.new一個執行緒隊形 需要建立Thread將自己的物件包起來 然後呼叫start()
特徵修飾符
synchronized(執行緒安全鎖) 同步 一個時間點只有一個執行緒訪問
1.將synchronized關鍵字放在方法的結構上
public synchronized void test(){} 鎖定的是呼叫方法時的物件
2.將synchronized關鍵字放在方法(構造方法 塊)的內部
public void get(){
程式碼1
synchronized(物件){//除了能鎖定當前物件(this),也可以鎖定其他物件
程式碼2
}
程式碼3
}
執行緒狀態的切換
執行 等待 執行 等待
Object類中的方法:
wait() 物件.wait()--訪問當前物件的執行緒進入wait狀態
notify()/notifyAll()
Thread中的方法
sleep()
run()
start()
所有執行緒都進入wait狀態的話,會產生假死狀態:沒有執行緒做事 不加鎖可能出現的異常: ArrayIndexOutOfBounsException:-1:陣列越界 IllegalMonitorStateException:讓其等待的執行緒物件不是當前執行緒的所有者 (訪問倉庫的執行緒等待,告知生產者的這一剎那,物件變成了另一個執行緒)
完善生產者消費模型
1.利用執行緒安全鎖 特徵修飾符(同步鎖) synchronized
兩種不同的寫法
不管怎樣寫 鎖定的永遠是物件
2.利用方法控制執行緒狀態的來回切換
wait
notify notifyAll
3.Thread類中的方法
sleep() 靜態方法(毫秒值)
setPrioity(10) getPriority()------設定/獲取執行緒的優先順序 1-10
sleep()與wait()的區別
sleep() wait()
1.類 Thread類 Object類
2.呼叫 靜態 類名. 物件.
3.理解 哪個執行緒呼叫 訪問該物件的執行緒進入等待
哪個執行緒等待 狀態
4.喚醒 不需要別人 需要其他物件呼叫notify喚醒
5.鎖 不會釋放鎖 等待後會釋放鎖
join()--Thread中的方法
讓多個執行緒並行變成單個執行緒
testjoin模型:
設計模型的時候,two執行緒在one的run裡面建立 兩個有先後順序
模型執行順序:
one 啟動
two 啟動
three 啟動
two.join()
2000之後, one想要把two從自己執行緒內剔除
two物件不在自己手裡 被three鎖定 10000
one只能等待three將two物件釋放後 才能踢掉
synchronized鎖,一旦物件被鎖定,其他的物件都需要等待
有可能會產生一個死鎖的效果
6.死鎖
模擬一個模型 演示死鎖(哲學家就餐問題)
四個執行緒同時併發去搶奪相同的資源
解決死鎖問題:
1.禮讓---產生時間差
2.不要產生物件公用的問題
計時器/定時器----->執行緒應用
java.util包
Timer類
無引數構造方法 建立物件
timer.schedule()