文档章节

使用 synchronized wait notify 实现生产者消费者

yaokangjun
 yaokangjun
发布于 2014/09/02 21:50
字数 573
阅读 90
收藏 0

一、先新建一个职员类,用于生产整数与消费整数的。

package com.yao.thread.syn;

public class Clerk {
	private int product = -1; //-1表示没有任何产品
	
	public synchronized void setProduct(int product){
		while (this.product != -1) {
			try {
				wait();
			} catch (InterruptedException e) {
				throw new RuntimeException(e);
			}
		}
		this.product = product;
		System.out.printf("生产者设定 %d %n",this.product);
		notify();
	}
	
	public synchronized int getProduct(){
		while (this.product == -1) {
			try {
				wait();
			} catch (InterruptedException e) {
				throw new RuntimeException();
			}
		}
		int temp = this.product;
		System.out.printf("消费者取走 %d %n",temp);
		this.product = -1;
		notify();
		return temp;
	}
}



二、再创建生产者,生产 0 到 9 共10个数据,每生产一个数据消费的时间为随机的,共生产10次。
package com.yao.thread.syn;

public class Producter implements Runnable {

	private Clerk clerk;
	
	public Producter(Clerk clerk){
		this.clerk = clerk;
	}
	
	@Override
	public void run() {
		System.out.println("生产者开始产生整数");
		for (int i = 0 ; i < 10 ; i++) {
			try {
				Thread.sleep((int)(Math.random()*3000));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			clerk.setProduct(i);
		}
	}

}



三、创建消费者,用来消费生产者生产的整数,因为生产者生产10次数据,所以消费者也消费10次数据。
package com.yao.thread.syn;

public class Consumer implements Runnable {

	private Clerk clerk;
	public Consumer(Clerk clerk){
		this.clerk = clerk;
	}
	@Override
	public void run() {
		System.out.println("消费都可以消费整数");
		for (int i = 0 ; i < 10 ; i++) {
			try {
				Thread.sleep((int)(Math.random()*3000));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			clerk.getProduct();
		}
	}

}



四、建立演示类:
package com.yao.thread.syn;

public class ConsumerProducterDemo {

	public static void main(String[] args) {
		Clerk clerk = new Clerk();
		Consumer consumer = new Consumer(clerk);
		Producter producter = new Producter(clerk);
		new Thread(consumer).start();
		new Thread(producter).start();
	}

}



五、执行后打印:
生产者开始产生整数
消费都可以消费整数
生产者设定 0 
消费者取走 0 
生产者设定 1 
消费者取走 1 
生产者设定 2 
消费者取走 2 
生产者设定 3 
消费者取走 3 
生产者设定 4 
消费者取走 4 
生产者设定 5 
消费者取走 5 
生产者设定 6 
消费者取走 6 
生产者设定 7 
消费者取走 7 
生产者设定 8 
消费者取走 8 
生产者设定 9 
消费者取走 9



用传统的方法来控制生产者与消费者是一种方式,但是如果用java.util.concurrent工具包会更加灵活。将在下面一章中说到。

© 著作权归作者所有

yaokangjun
粉丝 27
博文 62
码字总数 29408
作品 0
广州
程序员
私信 提问
如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例

wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。 在 Java 中可以用 wait、notify 和 ...

牧师-Panda
2016/10/20
36
0
Java并发编程初级篇(十六):Lock+Condition实现生产者消费者问题

之前我们在“Java并发编程初级篇(十二):使用wait和notify生产者消费者问题”,已经使用Java提供的synchronized关键字和wait(),notify(),notifyAll()方法实现过来生产者消费者问题。Java ...

阿拉德大陆的魔法师
2016/11/25
164
0
Java Queue协作同步机制

  在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作。比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期...

IamOkay
2016/08/11
218
0
java生产者消费者专题---谈谈优化(一)

在java生产者消费者专题---谈谈wait与sleep文中说明了使用wait与sleep方式实现的生产者消费者模式之间的区别,本篇主要谈谈使用wait方式实现时可能会遇到的一些问题,先贴上代码: public c...

FAT_mt
02/03
12
0
Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition

在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作。比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内...

Dreyer
2015/11/13
158
0

没有更多内容

加载失败,请刷新页面

加载更多

GUAVA--基础工具(Throwables)

1、异常传播 有时候,你会想把捕获到的异常再次抛出。这种情况通常发生在 Error 或 RuntimeException 被捕获的时候,你 没想捕获它们,但是声明捕获 Throwable 和 Exception 的时候,也包括了...

MrYuZixian
42分钟前
8
0
电磁兼容入门篇之辐射发射(辐射骚扰)试验

今天我们一起学习的是四个EMI测试项之一:辐射发射(RE),较前两篇相比的话,今天可能会有一点点深度,不过不用担心,我们先做一个了解,等到测试时或测试后再回过来结合本文,就能掌握的更...

demyar
53分钟前
6
0
Redis 事务:将一组命令放在同一个事务中进行处理

事务 MULTI 、 EXEC 、 DISCARD 和 WATCH 是 Redis 事务相关的命令。事务可以一次执行多个命令, 并且带有以下两个重要的保证: 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺...

须臾之余
56分钟前
8
0
Spring Boot Tomcat配置项

参数配置容器 server.xx开头的是所有servlet容器通用的配置,server.tomcat.xx开头的是tomcat特有的参数,其它类似。 所有参数绑定配置类:org.springframework.boot.autoconfigure.web.Serv...

xiaomin0322
今天
8
0
微课程 | 第二课《Docker 安装方式介绍》

微课程 | 第二课《Docker 安装方式介绍》视频 https://v.youku.com/v_show/id_XNDQ0NDUzNjkxNg==.html?spm=a2hzp.8244740.0.0 上一期我们介绍了 DBLE 的基本概况,下面进入我们的正题,正题基...

爱可生
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部