IT科技

當前位置 /首頁/IT科技 > /列表

notify,java

<link rel="stylesheet" href="https://js.how234.com/third-party/SyntaxHighlighter/shCoreDefault.css" type="text/css" /><script type="text/javascript" src="https://js.how234.com/third-party/SyntaxHighlighter/shCore.js"></script><script type="text/javascript"> SyntaxHighlighter.all(); </script>

java notify是什麼,讓我們一起了解一下?

notify是喚醒一個處於等待狀態的線程,調用notify時,只有一個等待線程會被喚醒而且它不能保證哪個線程會被喚醒,這取決於線程調度器。notify()方法的基本思想是給方法或代碼塊提供一種相互通信的方式,或者代碼塊同步於某個特定對象。

Java中notify和notifyAll的區別是什麼?

Java提供了兩個方法notify和notifyAll來喚醒在某些條件下等待的線程,你可以使用它們中的任何一個,但是Java中的notify和notifyAll之間存在細微差別,這使得它成為Java中流行的多線程面試問題之一。

當你調用notify時,只有一個等待線程會被喚醒而且它不能保證哪個線程會被喚醒,這取決於線程調度器。雖然如果你調用notifyAll方法,那麼等待該鎖的所有線程都會被喚醒,但是在執行剩餘的代碼之前,所有被喚醒的線程都將爭奪鎖定,這就是為什麼在循環上調用wait,因為如果多個線程被喚醒,那麼線程是將獲得鎖定將首先執行,它可能會重置等待條件,這將迫使後續線程等待。

因此,notify和notifyAll之間的關鍵區別在於notify()只會喚醒一個線程,而notifyAll方法將喚醒所有線程。

java notify

何時在Java中使用notify和notifyAll?

1、如果所有線程都在等待相同的條件,並且一次只有一個線程可以從條件變為true,則可以使用notify over notifyAll。

2、在這種情況下,notify是優於notifyAll 因為喚醒所有這些因為我們知道只有一個線程會受益而所有其他線程將再次等待,所以調用notifyAll方法只是浪費CPU。

3、雖然這看起來很合理,但仍有一個警告,即無意中的接收者吞下了關鍵通知。通過使用notifyAll,我們確保所有收件人都會收到通知。

實戰案例説明如下:

class NumberPrint implements Runnable{private int number;public byte res[];public static int count = 5;public NumberPrint(int number, byte a[]){this.number = number;res = a;}public void run(){synchronized (res){while(count-- > 0){try {res.notify();//喚醒等待res資源的線程,把鎖交給線程(該同步鎖執行完畢自動釋放鎖)System.out.println(" "+number);res.wait();//釋放CPU控制權,釋放res的鎖,本線程阻塞,等待被喚醒。System.out.println("------線程"+Thread.currentThread().getName()+"獲得鎖,wait()後的代碼繼續運行:"+number);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//end of whilereturn;}//synchronized}}public class WaitNotify {public static void main(String args[]){final byte a[] = {0};//以該對象為共享資源new Thread(new NumberPrint((1),a),"1").start();new Thread(new NumberPrint((2),a),"2").start();}}

TAG標籤:notify java #