博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程通信-----生产者与消费者案例
阅读量:1822 次
发布时间:2019-04-25

本文共 2267 字,大约阅读时间需要 7 分钟。

import java.util.LinkedList;public class Test {	public static void main(String[] args) {		Baskets baskets = new Baskets();		Producters producters = new Producters(baskets);		Consumers consumers = new Consumers(baskets);		producters.start();//生产者进行生产		consumers.start();//消费者进行消费	}}/** * 消费者线程 * @author Administrator * */class Consumers extends Thread{	private Baskets baskets = null;	public Consumers(Baskets baskets) {		this.baskets = baskets;	}	@Override	public void run() {		baskets.popApple();	}}/** * 生产者线程 * @author Administrator * */class Producters extends Thread{	private Baskets baskets = null;	public Producters(Baskets baskets) {		this.baskets = baskets;	}	@Override	public void run() {		baskets.pushApple();	}}class Baskets{	private LinkedList
basket = new LinkedList<>();//创建一个篮子原来存放Apples /** * 分四次取出苹果 */ public synchronized void popApple() {//需要声明同步方法才能获得该对象的锁 for(int i=0;i<20;i++) { pop(); } } /** * 分四次放苹果 */ public synchronized void pushApple() {//需要声明同步方法才能获得该对象的锁 for(int i=0;i<20;i++) { Apples apples = new Apples(i); push(apples); } } /** * 取出苹果 * @param apples */ public void pop() { if(basket.size() == 0) {//当篮子里面的苹果为0,通知并等待生产者来生产 try { wait();//等待并释放当前该对象锁 } catch (InterruptedException e) { e.printStackTrace(); } } try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("取出"+basket.removeFirst().toString()); notify();//通知生产者来生产 } /** * 存放苹果 * @param apples */ public void push(Apples apples) { if(basket.size() == 5) {//当篮子里面的苹果满了通知并等待消费者来消费 try { wait();//等待并释放当前该对象锁 } catch (InterruptedException e) { e.printStackTrace(); } } try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } basket.addFirst(apples); System.out.println("存放"+apples.toString()); notify();//通知消费者来消费 } }class Apples{ private int id; public Apples(int id) {//给每个苹果标号 this.id = id ; } public String toString() { return "苹果"+(id+1); }}

【运行结果】

存放苹果1

存放苹果2
存放苹果3
存放苹果4
存放苹果5
取出苹果5
取出苹果4
取出苹果3
取出苹果2
取出苹果1
存放苹果6
存放苹果7
存放苹果8
存放苹果9
存放苹果10
取出苹果10
取出苹果9
取出苹果8
取出苹果7
取出苹果6
存放苹果11
存放苹果12
存放苹果13
存放苹果14
存放苹果15
取出苹果15
取出苹果14
取出苹果13
取出苹果12
取出苹果11
存放苹果16
存放苹果17
存放苹果18
存放苹果19
存放苹果20
取出苹果20
取出苹果19
取出苹果18
取出苹果17
取出苹果16

转载地址:http://wcozf.baihongyu.com/

你可能感兴趣的文章
怎么查看本机S/N序列号和BIOS版本
查看>>
ThinkPad X1 Carbon安装win7.
查看>>
EasyOrtho卫星影像处理软件
查看>>
TerraMaster RAID Manager
查看>>
vmware vcenter converter(物理机转换虚拟机)
查看>>
解决Surface 网卡不识别
查看>>
回收站东西太多删不掉
查看>>
超融合与云计算的区别是什么?
查看>>
SuperSocket
查看>>
修改ant design的tooltip组件中的字体颜色(2分钟解决战斗)
查看>>
参观邓小平故居有感
查看>>
教你如何查看linux版本
查看>>
Linux下利用crontab执行任务
查看>>
RedHat Linux下注册Apache为系统服务
查看>>
使用LoadRunner监控Apache的步骤
查看>>
LoadRunner录制脚本时报加载GrooveUtil.dll出错的解决方法
查看>>
用Spotlight实时监控Windows Server 2008
查看>>
Tomcat 6.0.32中调整JVM大小及最大线程数
查看>>
Mysql数据库下载及安装
查看>>
MySql安装时解决要输入current root password的方法
查看>>