多執行緒(五) 執行緒間的通訊(等待喚醒機制)

2021-09-21 13:29:17 字數 2826 閱讀 6349

多個執行緒在處理同一資源,但是任務卻不同。

1,wait(): 讓執行緒處於凍結狀態,被wait的執行緒會被儲存到執行緒池中。

2,notify():喚醒執行緒池中乙個執行緒(任意).

3,notifyall():喚醒執行緒池中的所有執行緒。

這些方法都必須定義在同步中,因為這些方法是用於操作執行緒狀態的方法,必須要明確到底操作的是哪個鎖上的執行緒。

1,輸入乙個人名以及性別後,立即進行輸出

//資源

class resource

//輸入

class input implements runnable

public void run()

catch(interruptedexception e){}

if(x==0)

else

r.flag = true;

r.notify();

}x = (x+1)%2;

} }}//輸出

class output implements runnable

public void run()

catch(interruptedexception e){}

system.out.println(r.name+"....."+r.***);

r.flag = false;

r.notify();

}} }

}class resourcedemo2

}

執行結果

對上述**進行優化

class resource

catch(interruptedexception e){}

this.name = name;

this.*** = ***;

flag = true;

this.notify();

} public synchronized void out()

catch(interruptedexception e){}

system.out.println(name+"...+...."+***);

flag = false;

notify(); }}

//輸入

class input implements runnable

public void run()

else

x = (x+1)%2;

} }}//輸出

class output implements runnable

public void run() }

}class resourcedemo3

}

2,多生產者與多消費者(經典示例):2個執行緒生產商品,2個執行緒售賣商品。

class resource

catch(interruptedexception e){}//

this.name = name + count;//烤鴨1

count++;//2

system.out.println(thread.currentthread().getname()+"...生產者..."+this.name);//生產商品

flag = true;

notifyall();

} public synchronized void out()//

catch(interruptedexception e){} //t2

system.out.println(thread.currentthread().getname()+"...消費者........"+this.name);//消費商品

flag = false;

notifyall(); }}

class producer implements runnable

public void run() }

}class consumer implements runnable

public void run() }

}class producerconsumerdemo

}

執行結果:

分析:

1)選擇 while 判斷而不選擇if 判斷的原因:

if判斷標記,只判斷一次,如果被wait的執行緒被喚醒了,可能會導致不該執行的執行緒執行了,出現了資料錯誤的情況。而while判斷標記,解決了執行緒獲取執行權後,是否要執行!

2)notify:只能喚醒乙個執行緒,如果本方喚醒了本方,沒有意義。而且while判斷標記+notify會導致死鎖。

3)notifyall:喚醒全部執行緒,解決了本方執行緒一定會喚醒對方執行緒的問題。

4)while—notifyall notifyall方法喚醒了所有執行緒,不該被執行的執行緒也被喚醒,需要二次判斷,降低了**的效率。

()

144 多執行緒 執行緒間通訊 等待喚醒機制

class res class input implements runnable public void run catch exception e if x 0 else x x 1 2 r.flag true r.notify class output implements runnable ...

Java 多執行緒間的通訊 等待喚醒

有兩個執行緒 乙個給名字和性別賦值 input 乙個輸出名字和性別 output 但會一下輸出很多同樣的名字和性別 cpu沒切走 用等待喚醒機制 就可以 1 賦值乙個 然後input wait 喚醒output 2 輸出乙個 output wait 再喚醒input這樣可以賦值乙個 就輸出乙個等待 ...

多執行緒(五) 執行緒的通訊

例題 使用兩個執行緒列印1 100。執行緒1,執行緒2交替列印。執行緒通訊的例子 使用兩個執行緒列印1 100.執行緒1,執行緒2,交替列印。class number implements runnable catch interruptedexception e system.out.printl...