java多线程一章里面举了一个很经典的例子,它就是生产者和消费者的例子,比如说有一个篮子,里面能放6个饼,有厨师生产饼子,顾客吃饼子,厨师生产一个就往篮子里面放,放满的话,线程暂停,提醒顾客快吃;顾客一次吃一个饼子,如果篮子空了,线程也暂停,提醒厨师继续生产。
ProducerConsumer.java的源代码如下


package com.daozhao.java.thread;

public class ProducerConsumer {
	public static void main(String[] args){
		Basket b=new Basket();
		Producer p=new Producer(b);
		Consumer c=new Consumer(b);
		new Thread(p).start();
		new Thread(c).start();
	}
}

class WoTou{
	int id;
	WoTou(int id){
		this.id=id;
	}
	public String toString(){
		return "WoTou:" + id;
	}
}

class Basket{
	int index=0;
	WoTou[] arrWT=new WoTou[6];
	
	public synchronized void push(WoTou wt){
		while(index == arrWT.length){
			try{
				this.wait();
			}catch(InterruptedException i){
				i.printStackTrace();
			}
		}
		this.notify();
		arrWT[index]=wt;
		index++;
	}
	
	public synchronized WoTou pop(){
		while(index==0){
			try{
				this.wait();
			}catch(InterruptedException i){
				i.printStackTrace();
			}
		}
		this.notify();
		index--;
		return arrWT[index];
	}
}

class Producer implements Runnable{
	Basket b=null;
	Producer(Basket b){
		this.b=b;
	}
	
	public void run(){
		for(int i=0;i<20;i++){
			WoTou wt=new WoTou(i);
			b.push(wt);
			i++;
			System.out.println("生产了"+ wt);
			try{
				Thread.sleep(2000);
			}catch(InterruptedException ie){
				ie.printStackTrace();
			}
		}
	}
}

class Consumer implements Runnable{
	Basket b=null;
	Consumer(Basket b){
		this.b=b;
	}
	
	public void run(){
		for(int i=0;i<20;i++){
			WoTou wt=b.pop();
			System.out.println("消费了" + wt);
			try{
				Thread.sleep(1000);
			}catch(InterruptedException ie){
				ie.printStackTrace();
			}
		}
	}
}

随机文章

天下3到底有多火啊,要排队了
天下3到底有多火啊,要排队了

IOS在Cyber Monday的销量额贡献比android大
IOS在Cyber Monday的销量额贡献比android大

google+ 正式开放了
google+ 正式开放了

AngularJs的provider里面的装饰器decorator
AngularJs的provider里面的装饰器decorator

最简单的android手机联系人vcard(vcf后缀格式)规范格式
最简单的android手机联系人vcard(vcf后缀格式)规范格式

oppo(欧珀)手机刷机图文教程
oppo(欧珀)手机刷机图文教程

相关文章

Android BlueStacksAppPlayer最新测试版发布
Android BlueStacksAppPlayer最新测试版发布

engadget发布上周android系统更新摘要
engadget发布上周android系统更新摘要

新浪微博支持电信天翼和联通帐号登录
新浪微博支持电信天翼和联通帐号登录

安装运行angular2
安装运行angular2

忘记Google APP(谷歌企业邮箱、日历等)账号密码解决方案
忘记Google APP(谷歌企业邮箱、日历等)账号密码解决方案

内容分享:道招
本文链接:java多线程生产者消费者例子
道招声明:除特别标注或作者不详外,本站所有文章均为原创,转载请注明。欢迎共同关注互联网!