java notify是什么,让我们一起了解一下?
notify是唤醒一个处于等待状态的线程,调用notify时,只有一个等待线程会被唤醒而且它不能保证哪个线程会被唤醒,这取决于线程调度器。notify()方法的基本思想是给方法或代码块提供一种相互通信的方式,或者代码块同步于某个特定对象。
Java中notify和notifyAll的区别是什么?
Java提供了两个方法notify和notifyAll来唤醒在某些条件下等待的线程,你可以使用它们中的任何一个,但是Java中的notify和notifyAll之间存在细微差别,这使得它成为Java中流行的多线程面试问题之一。
当你调用notify时,只有一个等待线程会被唤醒而且它不能保证哪个线程会被唤醒,这取决于线程调度器。虽然如果你调用notifyAll方法,那么等待该锁的所有线程都会被唤醒,但是在执行剩余的代码之前,所有被唤醒的线程都将争夺锁定,这就是为什么在循环上调用wait,因为如果多个线程被唤醒,那么线程是将获得锁定将首先执行,它可能会重置等待条件,这将迫使后续线程等待。
因此,notify和notifyAll之间的关键区别在于notify()只会唤醒一个线程,而notifyAll方法将唤醒所有线程。
何时在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 block e.printStackTrace(); } }//end of while return; }//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(); } }
以上就是小编今天的分享了,希望可以帮助到大家。