wait()、notify()、notifyAll()

来源:互联网 发布:北京网络职业学院 八维 编辑:程序博客网 时间:2024/06/16 14:19

生产者和消费者示例

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();                 }             }         }     }
  1. 你可以使用wait和notify函数来实现线程间通信。你可以用它们来实现多线程(>3)之间的通信。

  2. 永远在synchronized的函数或对象里使用wait、notify和notifyAll,不然Java虚拟机会生成 IllegalMonitorStateException。

  3. 永远在while循环里而不是if语句下使用wait。这样,循环会在线程睡眠前后都检查wait的条件,并在条件实际上并未改变的情况下处理唤醒通知。

  4. 永远在多线程间共享的对象(在生产者消费者模型里即缓冲区队列)上使用wait。

  5. 更倾向用 notifyAll(),而不是 notify()。

0 0
原创粉丝点击