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

本文深入探讨了Java中的多线程生产者消费者问题,详细解释了同步机制的实现,包括wait()、notify()、notifyAll()方法的使用和注意事项。文章还分析了多生产者与多消费者问题,并引入了Lock接口和Condition接口作为解决方案,以提高效率。此外,介绍了线程池的概念和JDK内置线程池的使用,以及ConcurrentHashMap的特性。最后,文章给出了多线程相关的面试题,涵盖了线程基础知识、同步机制、线程池和并发容器等重要内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多线程

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

在这里插入图片描述

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

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) {
   
				//判断标志位
				
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值