1. 程式人生 > 實用技巧 >【2020牛客NOIP賽前集訓營-提高組(第一場)題解】( 牛牛的方程式,牛牛的猜球遊戲,牛牛的湊數遊戲,牛牛的RPG遊戲)

【2020牛客NOIP賽前集訓營-提高組(第一場)題解】( 牛牛的方程式,牛牛的猜球遊戲,牛牛的湊數遊戲,牛牛的RPG遊戲)

程式 可以理解為靜態程式碼

程序 正在進行的程式 靜態的程式碼 執行起來

執行緒 正在執行程式中的小單元

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()