多线程_生产者消费者问题

什么是多线程的生产者-消费者问题
当一个或者多个线程只负责往"数据缓冲区"中添加数据,而一个或者多个线程只负责从"数据缓冲区"中 取数据时可能造成的存数据时数据缓冲区满,或者取数据时,数据缓冲区为空的情况,这种情况就称为生产者-消费者问题.

而线程通信,就是在遇到"生产者-消费者问题"的时候需要用到的
生产者-消费者问题
(1)因为生产者-消费者都要操作数据缓冲区,所以数据缓冲区是共享的,就会可能造成线程通信问题.
(2)因为数据缓冲区的大小是有限的,所以就需要线程通信,就要用到wait和notify方法.
注意用wait和notify方法都需要用"同步锁"对象调用

如果用"非同步锁"对象调用wait和notify方***报错

一个案例:
厨师负责炒菜,炒好的菜放在工作台上,服务员负责给客户上菜,每次都要从工作台上取菜.工作台上能存储的菜的数量最大为10.

public class TestCommunicate {
	public static void main(String[] args) {
		//创建工作台
		WorkBench w= new WorkBench();
		//创建厨师
		Cook c = new Cook(w);
		Waiter t = new Waiter(w);
		//启动线程
		c.start();
		t.start();
	}

}
//因为要保证Cook和Waiter使用的是同一个WorkBench的对象,我们用传参数的方式
class  Cook extends Thread{
	//要使用WorkBench类中的方法:
	//(1)使用静态
	//(2)传递对象
	
	private   WorkBench w;
	public Cook(WorkBench w) {
		super();
		this.w =w;
		
	}
	public void run() {
		while(true) {
			try {
				Thread.sleep(90);
			} catch (InterruptedException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
			w.put();
		}
	}
}
class Waiter extends  Thread{
	private   WorkBench w;
	public Waiter(WorkBench w) {
		super();
		this.w= w;
		
	}
	public void run() {
		while(true) {
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
			w.take();
		}
	
	}
	
}
//模拟厨师出菜窗口
class WorkBench{
	//假设最多放10个菜
	private static final int MAX_VALUE =10;
	//num记录放的菜的数量
	private int num;
	
	public synchronized void take() {
		if(num<=0) {
			try {
				this.wait();
			} catch (InterruptedException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
		}
		num--;
		System.out.println("服务员拿走了一份菜剩余"+num);
		this.notify();
	}
	public synchronized void put() {
		if(num>=MAX_VALUE) {
			try {
				this.wait();
			} catch (InterruptedException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
		}
		num++;
		System.out.println("厨师又炒好了一份菜剩余"+num);
		this.notify();
	}
	
}

全部评论

相关推荐

我已成为0offer的糕手:别惯着,胆子都是练出来的,这里认怂了,那以后被裁应届被拖工资还敢抗争?
点赞 评论 收藏
分享
点赞 评论 收藏
分享
工作基本定了,比较满意。这深度学习真是难搞啊,论文看不懂,代码看不懂,不会改,创新点???&nbsp;还有一个月中期,怎么搞,已经抑郁了,没有小论文要求,我真是非常幸运了,不然就我这科研能力…………&nbsp;感觉自己对自己失去信心,无时无刻不在否定自己取得一些成绩都是运气好罢了,真的能顺利毕业吗?严重内耗、无力感爆棚啊…………
AI牛可乐:哎呀,听起来你最近压力好大呀,毕业论文和工作的双重压力一定让你感觉像是背了两座山呢。深度学习确实挺复杂的,就像是要在一片迷雾中找到出路一样。但是,你已经很棒了,工作都定好了,这是很大的成就呢! 论文的事情,别太担心。每个人都有看不懂代码和论文的时候,这是正常的。至于创新点嘛,有时候灵感就像小猫一样,需要一点一点地哄出来的。你可以先试试把你看过的资料整理一下,说不定就能找到新的思路呢。 中期答辩前,你可以列个计划,一步一步来,把大问题分解成小问题,一点一点克服。记得,你不是一个人在战斗,你的导师、同学都是你的战友哦。 至于信心嘛,别否定自己,每个人都会有低谷的时候。你已经取得的成绩,都是你实力的体现。毕业不是问题,只要你不放弃,就一定能顺利走过去的。加油哦,我相信你可以的! 对了,如果你愿意的话,可以点击我的头像,我们私信聊,也许我能帮你出出主意,或者就是简单地聊聊天,分散一下你的注意力也好呀。🐮💪🌟
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务