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(); } } } }
你可以使用wait和notify函数来实现线程间通信。你可以用它们来实现多线程(>3)之间的通信。
永远在synchronized的函数或对象里使用wait、notify和notifyAll,不然Java虚拟机会生成 IllegalMonitorStateException。
永远在while循环里而不是if语句下使用wait。这样,循环会在线程睡眠前后都检查wait的条件,并在条件实际上并未改变的情况下处理唤醒通知。
永远在多线程间共享的对象(在生产者消费者模型里即缓冲区队列)上使用wait。
更倾向用 notifyAll(),而不是 notify()。
0 0
- wait、notify、notifyAll
- notify();wait();notifyALL();
- wait() notify() notifyAll()
- wait、notify、notifyAll
- wait notify notifyAll
- wait(),notify(),notifyAll()
- wait(),notify(),notifyAll()
- wait,notify,notifyall
- sleep & wait | notify | notifyAll
- wait()与notify()/notifyAll()
- wait notify notifyall
- wait()、notify()、notifyAll()
- wait()和notify()/notifyAll()
- sleep & wait | notify | notifyAll
- wait notify notifyAll
- synchronized、wait、notify、notifyAll
- wait notify notifyall synchronized
- wait() notify() notifyAll()小结
- 【数据结构】算法8.1 边界标识法-分配
- 自动化测试之测试数据准备
- spring-data-jpa初步开始的helloworld
- 这是原创
- spring-boot 加载本地静态资源文件路径配置
- wait()、notify()、notifyAll()
- spring-boot 加入拦截器Interceptor
- oracle 12c RAC to Single Instance的Active Database Duplicate测试
- MD5,salt,SHA,PBKDF2加密
- Ubuntu--(3)shell快速入门
- jquery实现图片轮番效果(一)
- Android Activity 切屏处理
- Android调用打电话(Call Phone)
- Android自定义ListFragment 显示