java并发编程实战-30-通过生产者消费之模型了解等待唤醒机制---二周目

消费者等待生产者生产产品,造多了就不造了,少了就去生产。

抽取对象:消费者 生产者  电商

天猫:

package com.roocon.thread.ta7;

public class Tmall {
	
	private int count;
	
	public final int MAX_COUNT = 10;
	
	public synchronized void push () {
		while(count >= MAX_COUNT) {
			try {
				System.out.println(Thread.currentThread().getName() + " 库存数量达到上限,生产者停止生产。");
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		count ++;
		System.out.println(Thread.currentThread().getName() + " 生产者生产,当前库存为:" + count);
		notifyAll();
	}
	
	public synchronized void take () {
		
		while(count <= 0) {
			try {
				System.out.println(Thread.currentThread().getName() + " 库存数量为零,消费者等待。");
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		count --;
		System.out.println(Thread.currentThread().getName() + " 消费者消费,当前库存为:" + count);
		notifyAll();
	}

}

  不断的生产调用方法,这里不写逻辑知识调用:

package com.roocon.thread.ta7;

public class PushTarget implements Runnable {

	private Tmall tmall;
	
	public PushTarget(Tmall tmall) {
		this.tmall = tmall;
	}
	
	@Override
	public void run() {
		while(true) {
			tmall.push();
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}

 不断的消费

package com.roocon.thread.ta7;

public class TakeTarget implements Runnable {
	
	private Tmall tmall;
	
	public TakeTarget(Tmall tmall) {
		this.tmall = tmall;
	}

	@Override
	public void run() {
		while(true) {
			tmall.take();
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}

 main方法:

package com.roocon.thread.ta7;

public class Main {
	
	public static void main(String[] args) {
		
		Tmall tmall = new Tmall();
		
		PushTarget p = new PushTarget(tmall);
		TakeTarget t = new TakeTarget(tmall);
		
		new Thread(p).start();
		new Thread(p).start();
		new Thread(p).start();
		new Thread(p).start();
		new Thread(p).start();
		
		new Thread(t).start();
		new Thread(t).start();
		new Thread(t).start();
		new Thread(t).start();
		new Thread(t).start();
		new Thread(t).start();
		new Thread(t).start();
		new Thread(t).start();
		
		
	}
	
}

注意点关于if和while的:

notifyAll之后所有在wait等待的线程都会被唤醒的。非线程安全的执行count++;

if换为while

为什么?https://blog.csdn.net/worldchinalee/article/details/83790790

不wait的话就要去消费的。

----------------------ta7------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值