经典生存者消费者模型,使用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 中可以用 wait、notify 和 notifyAll 来实现线程间的通信。。举个例子,如果你的Java程序中有两个线程——即生产者和消费者,那么生产者可以通知消费者,让消费者开始消耗数据,因为队列缓冲区中有内容待...
源码—Java多线程5—死锁和wait notify notifyAll
本文主要介绍Java notify和notifyAll的知识,这里整理详细的资料来说明notify 和NotifAll的区别,有需要的小伙伴可以参考下
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 我的答案 源码...
wait和notify讲解
wait()、notify()和notifyAll()方法2---马克-to-win java视频
wait()、notify()和notifyAll()方法1---马克-to-win java视频
主要介绍了Java多线程中wait、notify、notifyAll使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
使用Java多线程的wait和notify方法实现最简单的生产者消费者模式
主要介绍了Java 中Object的wait() notify() notifyAll()方法使用的相关资料,需要的朋友可以参考下
一个简单的线程同步机制,也能实例了解wait notify的使用,notify与notifyAll的区别
本篇文章对Java中多线程notify与notifyall的区别进行了详细的分析介绍。需要的朋友参考下
主要介绍了 java notify和notifyAll的对比的相关资料,需要的朋友可以参考下
本篇文章是对java的 wait(),notify(),notifyAll()进行了详细的分析介绍,需要的朋友参考下
Java多线程同步(wait()notify()notifyAll())[文].pdf
3.wait,notify和notifyAll只能在同步方法或同步代码块中调用,而sleep可以在任何地方调用; 4.sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常。(如果不是在同步方法或同步代码块中调用wait()方法,...
主要介绍了Java wait和notifyAll实现简单的阻塞队列,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
使用wait()和notify()实现的生产者与消费者模型,可以了解如何使用wait()和notify()进行线程间通信。(上一次上传的代码有一个问题没有考虑到,这次修补了——CSDN没法撤销资源,只能再上传了)
开一个子线程来完成一个循环处理的工作,我在主线程中能灵活控制这个子线程的开始、暂停/继续、结束。