Thread类之-生产者消费者模式

为了避免死锁,我们引用生产者消费者模式,就像我要筷子的时候,你就把筷子给我,我吃一口,然后你要碗的时候,我就把碗给你,你再吃一口。

共享吃饭程序:

我吃的时候你把筷子给我,你吃的时候我把碗给你

public class CHIFAN {

	// 信号灯,为true 的时候我吃,你看,为false 的时候我看你吃
	private boolean flag = true;
	
	/**
	 * 我吃你看,我是消费者
	 */
	public synchronized void eat() {
		if(!this.flag) {	// 生产者等待,筷子给你
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		// 得到筷子了,开始吃饭
		try {
			Thread.sleep(300);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println( "好了,我吃了一口,筷子给你" );
		// 通知消费者
		this.notify();
		// 生产者停下
		this.flag = false;
	}
	
	/**
	 * 你吃我看,我把碗给你,你来生产
	 */
	public synchronized void youeat() {
		if(this.flag) { // 消费者等待
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		// 得到碗了,开始吃饭
		try {
			Thread.sleep(300);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println( "好了,我也吃了一口,碗也给你" );
		// 通知生产
		this.notify();
		// 通知生产者
		this.flag = true;
	}

}

你把碗给我,我先吃一口

public class YOU implements Runnable {

	private CHIFAN chifan;
	
	public YOU(CHIFAN chifan) {
		super();
		this.chifan = chifan;
	}

	@Override
	public void run() {
		for (int i = 0; i < 20; i++) {
			// 偶数我吃,奇数你吃
			this.chifan.eat();
		}
	}

}

你把筷子给我,我在吃一口:

public class ME implements Runnable {

	private CHIFAN wan;
	
	public ME(CHIFAN wan) {
		super();
		this.wan = wan;
	}

	@Override
	public void run() {
		for (int i = 0; i < 20; i++) {
			// 偶数我吃,奇数你吃
			if( 0 == i%20 ) {
				this.wan.eat();
			}else {
				this.wan.youeat();
			}
		}
	}

}

调用:

public static void main(String[] args) {
		// 吃饭,共同的资源
		CHIFAN c = new CHIFAN();
		
		// 多线程
		ME m = new ME(c);
		YOU y = new YOU(c);
		
		new Thread(m).start();
		new Thread(y).start();
	}

运行效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值