????wait?? notify ?? notifyAll????Щ???????б?????????????????????????????????????????б????????????????Щ????????y???????????
?????? Java ?п????? wait??notify ?? notifyAll ??????????????????????????????Java???????????????——??????????????????????????????????????????????????????????????л?????????????????????????????????????????????????????????????????????????????????Щ??????????????????
???????????????wait()?????????????Щ????????????С????磬??????????????????У????????????????????????????????????????????????????????С?????Щ????????Щ???????????????Щ????????????????? notify ?? notifyAll ??????Щ????е?????????????С????????????notify ?????????????????????????????????????????? notifyAll ???????е???е????????????????????????????????????notify??notifyAll?????????????????????????????????????????notify??????????????????????????????????κ???????notifyAll???????е???е?????
???????????????????????????? wait??notify ?? notifyAll ?????????????????????????????????????????????????????Java?е???????????????????????Brian Goetz???????Java Concurrency in Practice | Java ?????????????????????? Java ?????????????????????????Java?????????????????
??????????Wait
???????????wait??notify????????????????????Object???????????????????д????????????????????????????????????д??????wait??notify???????????????????????????????????е???????????????????????Щ??????????????????? synchronized ????????ж????????????wait?????????????淶?????????????????????????????????????????????????о????????
?????????????????????????????????wait()??????wait()??????Thread???μ??????????????????Thread.call()?????????Java?????????????д?????????????????Thread.sleep()?????????????????wait() ???????????????????????????????????????????????????????????乲??????Object?????wait?????????????????????У?????????Object??????????????С?
????????????????????????????synchronized?????????????????wait???????????????synchronized?????????????????????????????synchronized??????????????????????????????????????????У?????synchronized????????????????С??????????????????????????……??????????????????????????……??
????????? Java ???????? wait?? notify ?? notifyAll – ????????????????????
??????????????loop??????? wait ?? notify???????? If ???
?????????????wait?????????synchronized??????o???????????????????????????????????????????????????????while???????????if????е???wait?????????????Щ?????μ????——???????????????“???????????????????????????????????????”????????????д???if?????if???????Щ????С???????????????????????????????п???????????????????????????????????????while?????黽????????????????????п???????——?????????????????????????????????????????????????????????????С????????????????????while?????????if????????wait?????????????Effective Java????????????????????wait??notify????ο??????
?????????????????????????????wait??notify??????淶??????壺
????// The standard idiom for calling the wait method in Java
????synchronized (sharedObject) {
????while (condition) {
????sharedObject.wait();
????// (Releases lock?? and reacquires on wakeup)
????}
????// do action based upon condition e.g. take or put into queue
????}
????????????????????while????????wait?????????????????????????????????????????????????δ???wait????????notify????????????????????????????????????п??????????????
????Java wait()?? notify()?? notifyAll() ????
????????????????????wait??notify????????????????????????????????????????Щ????淶??????????????????????PRODUCER???????????CONSUMER???????????????????????Producer??Consumer????Producer??Consumer???????Thread??Producer??Consumer?????????????????run()???????Main???????????????????????????????????LinkedList????????????У???Java?У?LinkedList???????е??????????????????????г?????LinkedList???????????????LinkedList??????????while(queue.size == maxSize)???????м???????????????????????????????????????????ж??????????synchronized?????????????????????????????????????????С????????????????PRODUCER??????CONSUMER???????????????????????????????notify????PRODUCER??????????????????????????У?wait??notify????????????????????????
????import java.util.LinkedList;
????import java.util.Queue;
????import java.util.Random;
????/**
????* Simple Java program to demonstrate How to use wait?? notify and notifyAll()
????* method in Java by solving producer consumer problem.
????*
????* @author Javin Paul
????*/
????public class ProducerConsumerInJava {
????public static void main(String args[]) {
????System.out.println("How to use wait and notify method in Java");
????System.out.println("Solving Producer Consumper Problem");
????Queue<Integer> buffer = new LinkedList<>();
????int maxSize = 10;
????Thread producer = new Producer(buffer?? maxSize?? "PRODUCER");
????Thread consumer = new Consumer(buffer?? maxSize?? "CONSUMER");
????producer.start(); consumer.start(); }
????}
????/**
????* Producer Thread will keep producing values for Consumer
????* to consumer. It will use wait() method when Queue is full
????* and use notify() method to send notification to Consumer
????* Thread.
????*
????* @author WINDOWS 8
????*
????*/
????class Producer extends Thread
????{ private Queue<Integer> queue;
????private int maxSize;
????public Producer(Queue<Integer> queue?? int maxSize?? String name){
????super(name); this.queue = queue; this.maxSize = maxSize;
????}
????@Override public void run()
????{
????while (true)
????{
????synchronized (queue) {
????while (queue.size() == maxSize) {
????try {
????System.out .println("Queue is full?? " + "Producer thread waiting for " + "consumer to take something from queue");
????queue.wait();
????} catch (Exception ex) {
????ex.printStackTrace(); }
????}
????Random random = new Random();
????int i = random.nextInt();
????System.out.println("Producing value : " + i); queue.add(i); queue.notifyAll();
????}
????}
????}
????}
????/**
????* Consumer Thread will consumer values form shared queue.
????* It will also use wait() method to wait if queue is
????* empty. It will also use notify method to send
????* notification to producer thread after consuming values
????* from queue.
????*
????* @author WINDOWS 8
????*
????*/
????class Consumer extends Thread {
????private Queue<Integer> queue;
????private int maxSize;
????public Consumer(Queue<Integer> queue?? int maxSize?? String name){
????super(name);
????this.queue = queue;
????this.maxSize = maxSize;
????}
????@Override public void run() {
????while (true) {
????synchronized (queue) {
????while (queue.isEmpty()) {
????System.out.println("Queue is empty??" + "Consumer thread is waiting" + " for producer thread to put something in queue");
????try {
????queue.wait();
????} catch (Exception ex) {
????ex.printStackTrace();
????}
????}
????System.out.println("Consuming value : " + queue.remove()); queue.notifyAll();
????}
????}
????}
????}
????????? Java ???????? wait?? notify ?? notifyAll – ????????????????????
??????????????????????????????debug????????????????????debug???????????????????PRODUCER????CONSUMER??????????????????????CPU???????????????wait()?????????????????????????????????????????????????????п???????????????????????????????????????Eclipse???Step into??Step over?????????????????????????顣
???????????
????1. ????????wait??notify??????????????????????????????????????>3??????????
????2. ?????synchronized???????????????wait??notify??notifyAll?????Java??????????? IllegalMonitorStateException??
????3. ?????while??????????if????????wait???????????????????????????wait??????????????????????δ????????′??????????
????4. ?????????乲????????????????????????T?????????У??????wait??
????5. ???????????????????????? notifyAll()???????? notify()??
????????? Java ???????? wait?? notify ?? notifyAll – ????????????????????
???????????Java????????wait?? notify??notifyAll??????????????????????????????????????????????Щ?????????Java???к???????????????????????????????磬???????????????????????????????????????BlockingQueue??????????????е????????????????????????????????????????????????????????????У???????????CycliBarrier????CountDownLatch????????????????????????????????????Semaphore??