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

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

而线程通信,就是在遇到"生产者-消费者问题"的时候需要用到的
生产者-消费者问题
(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();
	}
	
}

全部评论

相关推荐

03-06 20:09
贵州大学 Java
King987:你这个学历找个中大厂刷实习经历都是可以的,但是项目要有亮点才行,这个什么外卖就不要做了,去找找最新的项目,至少涉及高并发或者是新型的AI技术mcp rag啥的 ,我在出简历点评,但是你这个没什么好点评的,内容太少,而且含金量太低。自己改一改吧,或者看一下我的项目地址中,那里有大厂最近做过的实习项目
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 长得好看会提高面试通过率吗? #
3876次浏览 45人参与
# 离家近房租贵VS离家远但房租低,怎么选 #
16896次浏览 137人参与
# 米连集团26产品管培生项目 #
7282次浏览 226人参与
# 春招至今,你的战绩如何? #
15630次浏览 144人参与
# 你的实习产出是真实的还是包装的? #
3051次浏览 53人参与
# 沪漂/北漂你觉得哪个更苦? #
1513次浏览 40人参与
# MiniMax求职进展汇总 #
25122次浏览 321人参与
# HR最不可信的一句话是__ #
1078次浏览 32人参与
# AI面会问哪些问题? #
935次浏览 23人参与
# 你做过最难的笔试是哪家公司 #
1228次浏览 22人参与
# AI时代,哪个岗位还有“活路” #
2814次浏览 51人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152901次浏览 889人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
8007次浏览 43人参与
# XX请雇我工作 #
51155次浏览 171人参与
# 简历第一个项目做什么 #
32131次浏览 360人参与
# 简历中的项目经历要怎么写? #
311028次浏览 4264人参与
# 投格力的你,拿到offer了吗? #
178337次浏览 891人参与
# 你最满意的offer薪资是哪家公司? #
76978次浏览 375人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187585次浏览 1123人参与
# AI时代,哪些岗位最容易被淘汰 #
64704次浏览 883人参与
# 如果重来一次你还会读研吗 #
230010次浏览 2011人参与
# 正在春招的你,也参与了去年秋招吗? #
364336次浏览 2642人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务