多线程生产者消费者问题详解-附面试题大全【精】

多线程生产者与消费者(线程通信)实现生产者和消费者案例(一)public class Resource { //定义布尔类型的成员,标志位,指示线程该做什么 //false没有,需要生产, true需要消费 boolean flag = false; int count ;//包子的计数器}public class Product implements Runnable { //创建资源对象 Resource r = new Resource(); public void r
摘要由CSDN通过智能技术生成

多线程

生产者与消费者(线程通信)

在这里插入图片描述

实现生产者和消费者案例(一)

public class Resource {
   
	//定义布尔类型的成员,标志位,指示线程该做什么
	//false没有,需要生产, true需要消费
	boolean flag = false;
	
	int count ;//包子的计数器
}
public class Product implements Runnable {
   
	//创建资源对象
	Resource r = new Resource();
	public void run() {
   
		while(true) {
   
			//对象资源进行操作,判断变量
			if(r.flag == true) {
   
				//没有被消费,不能生产,等待
				try{
   wait();}catch(Exception ex) {
   ex.printStackTrace();}
			}
			//可以生产
			r.count++;
			System.out.println("生产了第"+r.count+"个");
			//修改标志位
			r.flag = true;//可以消费
			//唤醒消费的线程
			notify();
		}
	}
}
public class Customer implements Runnable{
   
	//创建资源对象
	Resource r = new Resource();
	public void run() {
   
		while(true) {
   
			//判断标志位
			if(r.flag == false) {
   
				//需要生产,不能消费,等待
				try{
   wait();}catch(Exception ex) {
   ex.printStackTrace();}
			}
			//可以消费
			System.out.println("消费了第"+r.count+"个");
			//修改标志位,已经消费,可以生产
			r.flag = false;
			//唤醒生产线程
			notify();
		}
	}

}

以上程序启动线程后,抛出异常 java.lang.IllegalMonitorStateException(运行时期的异常) 异常称为无效的监视器状态异常. 使用了线程的方法,来自于Object类: wait() notify() , 方法必须出现在同步中

解决异常问题,使用同步代码块

实现生产者和消费者案例(二)

添加了同步代码块后,程序居然停止不动了

分析原因 : notify()方法的时候,没有唤醒任何一个线程,导致的生产和消费的两个线程都处于wait()状态

两个方向的线程,使用的锁不是一个

解决办法 : 生产者线程和消费者线程,使用同一个对象锁, wait() notify()方法调用者,必须是锁对象

public class Product implements Runnable {
   
	//创建资源对象
	Resource r ;
	
	public Product(Resource r) {
   
		this.r = r;
	}
	
	public void run() {
   
		while(true) {
   
			synchronized(r) {
   
				//对象资源进行操作,判断变量
				if(r.flag == true) {
   
					//没有被消费,不能生产,等待
					try{
   r.wait();}catch(Exception ex) {
   ex.printStackTrace();}
				}
				//可以生产
				r.count++;
				System.out.println("生产了第"+r.count+"个");
				//修改标志位
				r.flag = true;//可以消费
				//唤醒消费的线程
				r.notify();
			}
		}
	}
}
public class Customer implements Runnable{
   
	//创建资源对象
	Resource r ;
	
	public Customer(Resource r) {
   
		this.r = r;
	}
	
	public void run() {
   
		while(true) {
   
			synchronized(r) {
   
				//判断标志位
				if
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值