经典生存者消费者模型,使用Object的wait,notify和notifyAll实现
调用wait()方法使当前线程暂停执行并释放对象锁标示,让其他线程可以进入synchronized数据块,当前线程被放入对象等待池中。
调用notify()方法后,将从对象的等待池中移走一个任意的线程并放到锁标志等待池中,只有锁标志等待池中线程能够获取锁标志;如果锁标志等待池中没有线程,则notify()不起作用。
调用notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。
/**************************************************************************************** Copyright © 2014 Your Company/Org. All rights reserved.<br> Reproduction or transmission in whole or in part, in any form or<br> by any means, electronic, mechanical or otherwise, is prohibited<br> without the prior written consent of the copyright owner. <br> ****************************************************************************************/ package com.beston.concurrency.synchronization; /** * @ClassName: WaitNotify * @Description: 经典生存者消费者模型,使用Object的wait,notify和notifyAll实现 * @author beston * @date 2014年3月28日 上午10:11:10 * @version v1.0 * */ public class WaitNotify { public static void main(String[] a){ Target t = new Target(); ProduceThread p = new ProduceThread(t); ConsumeThread c = new ConsumeThread(t); Thread t1 = new Thread(p,"生产线程1"); Thread t2 = new Thread(p,"生产线程2"); Thread t3 = new Thread(c,"消费线程1"); Thread t4 = new Thread(c,"消费线程2"); t1.start(); t2.start(); t3.start(); t4.start(); } } class Target{ public int i = 0; public synchronized void produce(){ if(i == 4){ try { System.out.println(Thread.currentThread().getName()+":生产满了,等待消费操作"); this.wait(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }else{ i++; this.notifyAll(); } System.out.println(Thread.currentThread().getName()+":"+i); } public synchronized void consume(){ if(i == 0){ try { System.out.println(Thread.currentThread().getName()+":消费完了,等待生产操作"); this.wait(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }else{ i--; this.notifyAll(); } System.out.println(Thread.currentThread().getName()+":"+i); this.notifyAll(); } } class ProduceThread implements Runnable{ private Target t; public ProduceThread(Target t){ this.t = t; } /* (non-Javadoc) * @see java.lang.Runnable#run() */ @Override public void run() { for(int i=0;i<20;i++){ t.produce(); try { Thread.sleep((long) (Math.random()*50)); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } class ConsumeThread implements Runnable{ private Target t; public ConsumeThread(Target t){ this.t = t; } /* (non-Javadoc) * @see java.lang.Runnable#run() */ @Override public void run() { for(int i=0;i<20;i++){ t.consume(); try { Thread.sleep((long) (Math.random()*50)); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
结果:
生产线程1:1
消费线程1:0
生产线程2:1
消费线程2:0
生产线程2:1
消费线程2:0
消费线程1:消费完了,等待生产操作
生产线程2:1
消费线程1:1
生产线程1:2
生产线程1:3
生产线程1:4
消费线程2:3
生产线程1:4
生产线程2:生产满了,等待消费操作
消费线程2:3
生产线程2:3
消费线程1:2
生产线程2:3
消费线程2:2
消费线程2:1
消费线程1:0
生产线程1:1
消费线程1:0
生产线程2:1
消费线程1:0
消费线程2:消费完了,等待生产操作
生产线程2:1
生产线程1:2
消费线程1:1
消费线程2:1
生产线程2:2
消费线程2:1
消费线程1:0
生产线程1:1
生产线程1:2
生产线程2:3
消费线程1:2
消费线程2:1
消费线程1:0
生产线程1:1
生产线程1:2
消费线程1:1
生产线程2:2
消费线程2:1
消费线程1:0
消费线程2:消费完了,等待生产操作
生产线程1:1
消费线程2:1
生产线程2:2
消费线程2:1
生产线程1:2
生产线程1:3
生产线程1:4
消费线程1:3
消费线程1:2
生产线程2:3
消费线程2:2
生产线程1:3
消费线程1:2
生产线程1:3
生产线程2:4
消费线程2:3
生产线程1:4
消费线程1:3
生产线程1:4
生产线程2:生产满了,等待消费操作
生产线程1:生产满了,等待消费操作
消费线程2:3
生产线程1:3
生产线程2:3
生产线程2:4
生产线程2:生产满了,等待消费操作
消费线程1:3
生产线程2:3
消费线程2:2
消费线程1:1
消费线程2:0
生产线程2:1
消费线程1:0
消费线程2:消费完了,等待生产操作
消费线程1:消费完了,等待生产操作
生产线程2:1
消费线程1:1
消费线程2:1
生产线程2:2
消费线程2:1
生产线程2:2
消费线程2:1
相关推荐
在Java中,`wait()`, `notify()`, 和 `notifyAll()` 是Java Object类的三个方法,它们在实现线程间通信和协作时扮演着关键角色。这些方法主要用于解决线程等待和唤醒的问题,是基于Java Monitor(监视器)模型的。 ...
在 Java 中可以用 wait、notify 和 notifyAll 来实现线程间的通信。。举个例子,如果你的Java程序中有两个线程——即生产者和消费者,那么生产者可以通知消费者,让消费者开始消耗数据,因为队列缓冲区中有内容待...
源码—Java多线程5—死锁和wait notify notifyAll
例如,在生产者-消费者模型中,生产者线程可以使用wait()方法等待消费者线程的唤醒,而消费者线程可以使用notify()或notifyAll()方法唤醒生产者线程。 wait、notify、notifyAll方法是Java多线程编程中非常重要的...
`wait()`、`notify()`和`notifyAll()`是Java中的三个关键字,它们属于Object类的方法,主要用于线程间的通信,尤其在实现生产者消费者模式时发挥着重要作用。本文将深入探讨这些方法以及如何在实际场景中应用它们。 ...
1.3 notify、notifyAll的区别2 两个比较经典的使用案例2.1 案例1 — ABCABC。。。三个线程顺序打印问题2.1.1 题目2.1.2 题目分析2.1.3 我的答案2.2 生产者消费者问题2.2.1 题目2.2.2 题目分析2.2.3 我的答案 源码...
Java中的`notify`和`notifyAll`是多线程编程中的关键方法,它们用于线程间的通信,特别是在处理同步机制时。这两个方法都是在`Object`类中定义的,因此可以应用于任何Java对象。 首先,我们需要理解Java的同步机制...
wait和notify讲解
wait()、notify()和notifyAll()方法2---马克-to-win java视频
wait()、notify()和notifyAll()方法1---马克-to-win java视频
### 使用wait和notifyAll方法详解 #### 一、引言 在Java多线程编程中,`wait()` 和 `notifyAll()` 方法是非常重要的同步机制,主要用于实现线程间的通信与同步控制。通过合理运用这些方法,可以有效地解决生产者...
在Java并发编程中,Object的wait()、notify()和notifyAll()方法是非常重要的概念,这三个方法都是Object类的方法,可以认为任意一个Object都是一种资源(或者资源的一个代表)。在并发编程中,线程安全是非常重要的...
Java之wait和notify的用法详解 在Java多线程编程中,wait和notify是两个非常重要的方法,它们都是Object类的方法,用于线程之间的通信和同步。下面我们将详细解释wait和notify的用法。 wait方法 wait方法是Object...
在Java中,`wait()` 和 `notify()` 方法是实现线程间通信和协作的重要工具,它们属于 `java.lang.Object` 类,这意味着所有类都默认继承了这两个方法。本文将详细探讨如何使用 `wait()` 和 `notify()` 来控制子线程...
在实际开发中,`wait()`, `notify()`和`notifyAll()`常用于实现生产者-消费者模型、哲学家就餐问题等经典并发问题。它们提供了一种精细控制线程间交互的方式,但使用时需谨慎,避免死锁和活锁的发生。 总之,理解和...
Java wait和notifyAll实现简单的阻塞队列 在 Java 中,wait 和 notifyAll 是两个非常重要的方法,它们都是在 Object 类中声明的,用于实现线程之间的通信和同步。wait 方法会使调用线程进入等待状态,并释放所持有...
总之,Java多线程同步通过wait()、notify()和notifyAll()等方法,配合synchronized关键字,实现了对共享资源的访问控制,保证了程序的正确性。同时,原子操作和volatile关键字提供了更细粒度的线程安全保证。理解并...
例如,在生产者-消费者模型中,生产者线程在向共享缓冲区添加元素时可能会调用`wait()`,直到有空闲空间可用。消费者线程在移除元素后会调用`notify()`或`notifyAll()`来唤醒一个或所有等待的生产者线程,告知它们...
Java中的`wait()`, `notify()`, 和 `notifyAll()` 是多线程编程中的关键工具,它们用于在并发环境中协调线程间的交互。这些方法都定义在`java.lang.Object`类中,因为它们与对象的监视器(monitor)概念密切相关。...
在本节中,我们将详细介绍wait()、notify()和notifyAll()方法的使用和实现原理。 wait()方法 wait()方法是一个对象的方法,用于使当前线程等待该对象的锁定,以便其他线程可以获取该锁定并继续执行。当一个线程...