《生产者与消费者》简单例子?

<span style="font-family:Times New Roman;">package communication;</span>
<span style="font-family:Times New Roman;">
//运行结果不太能理解,-1 ????

/*开始消费者调用消费方法时处于等待状态,此时唤起生产者线程
 * 生产者开始生产共享数据之后,消费者进行消费,但是当共享数据为空,所有消费者必须等待,生产者继续生产,然后消费者再次消费
 * 如此循环直到程序运行最后,可以看到线程一直等待。
 * 这个线程进入等待后没有其他线程唤醒,出除非强行退出JVM环境,否则一直等待..*/


public class ThreadCommunication{
	public static void main(String args[]){
		Queue q = new Queue();
		Producer p = new Producer(q);
		Consumer c = new Consumer(q);
		
		c.start();
		p.start();
		
	}
}

//生产者线程
 class Producer extends Thread {
	Queue q;

	Producer(Queue q) {
		this.q = q;

	}

	public void run() {
		for (int i = 0; i < 5; i++) {
			q.put(i);// 给队列中添加元素

		}
	}

}

// 消费者线程
class Consumer extends Thread {
	Queue q;

	Consumer(Queue q) {
		this.q = q;

	}

	public void run() {
		while (true) {
			q.get();// 删除队列元素,返回队列余值

		}
	}

}

class Queue {

	int value = 0;//初始时,队列中元素个数value为0
	boolean isEmpty = true;//用于判断队列的状态,空或非空

	//生产者生产方法
	public synchronized void put(int v) {
		if(!isEmpty){//队列不空时,生产者线程等待
			System.out.println("队列非空,生产者等待...");
			try {
				wait();//等待队列有空闲
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		//队列为空时,生产者生产,value+1;isEmpty置为false
		System.out.println("\n生产者生产:");
		value+=v;//value值加v
		isEmpty = false;
		System.out.println("生产者共生产数量:"+v);
		notify();//生产者生产之后通知消费者消费
	}
	//消费者消费方法
	public synchronized int get() {
		if(isEmpty){//队列为空时,消费者线程等待。
			System.out.println("队列为空,消费者等待...");
			try {
				wait();//等待队列有空闲
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		//队列不空时,消费:value-1;减到0,将isEmpty置为true通知生产者生产。
		System.out.println("\n消费者消费:");
		value--;//value值减v
		if(value<1){//判断value是否减成了零
			isEmpty =true;
		}
		System.out.println("消费者消费一个,剩余:"+value);
		notifyAll();//消费者消费后,通知生产者生产
		return value;
	}

}
</span>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值