wait()、notify()实现生产者、消费者问题

生产者、消费者问题是典型的线程同步的问题,这里我们先看一种最简单的情况,就是一个生产者、一个消费者、一个缓冲区。程序必须满足下面的情况:

1.从缓冲区投放产品和取出产品必须是互斥的

2.缓冲区为空时才可以投放产品,缓冲区不为空时才可以取出产品

从操作系统的角度解决这个问题可以使用PV操作,java是支持多线程的,在java中运用对象的方法wait()和notify()可以实现PV操作,以下是具体代码:

public class ProducerConsumerDemo{
	public static void main(String[] args) {
		Resource r = new Resource();
		Producer pro = new Producer(r);
		Consumer con = new Consumer(r);

		Thread t1 = new Thread(pro);
		Thread t2 = new Thread(con);

		t1.start();
		t2.start();
	}
}

class Resource{
	private String name;
	private int count = 1;
	private boolean flag = false;

	public synchronized void put(){
		if(flag)
			try{this.wait();}catch(Exception e){}
		this.name = "product------"+count++;
		System.out.println(Thread.currentThread().getName()+"--producer--"+this.name);
		flag = true;
		this.notify();
	}

	public synchronized void out(){
		if(!flag)
			try{this.wait();}catch(Exception e){}
		System.out.println(Thread.currentThread().getName()+"--consumer--"+this.name);
		flag = false;
		this.notify();
	}
}

class Producer implements Runnable{
	Resource res = new Resource();
	Producer(Resource res){
		this.res = res;
	}
		
	public void run(){
		while(true)
			res.put();
	}

}

class Consumer implements Runnable{
	Resource res = new Resource();
	Consumer(Resource res){
		this.res = res;
	}
		
	public void run(){
		while(true)
			res.out();
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值