线程通信-----生产者与消费者案例

本文介绍了一个使用Java实现的生产者消费者模式案例。通过一个共享的篮子作为缓冲区,生产者线程负责往篮子里放入苹果,而消费者线程则从篮子中取出苹果。为了确保线程间的正确交互,使用了synchronized关键字来实现互斥访问,并利用wait和notify机制协调生产者和消费者的行为。

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

import java.util.LinkedList;

public class Test {

	public static void main(String[] args) {
		Baskets baskets = new Baskets();
		Producters producters = new Producters(baskets);
		Consumers consumers = new Consumers(baskets);
		producters.start();//生产者进行生产
		consumers.start();//消费者进行消费
	}

}


/**
 * 消费者线程
 * @author Administrator
 *
 */
class Consumers extends Thread{
	private Baskets baskets = null;
	public Consumers(Baskets baskets) {
		this.baskets = baskets;
	}
	@Override
	public void run() {
		baskets.popApple();
	}
}

/**
 * 生产者线程
 * @author Administrator
 *
 */
class Producters extends Thread{
	private Baskets baskets = null;
	public Producters(Baskets baskets) {
		this.baskets = baskets;
	}
	@Override
	public void run() {
		baskets.pushApple();
	}
}



class Baskets{
	private LinkedList<Apples> basket = new LinkedList<>();//创建一个篮子原来存放Apples
	/**
	 * 分四次取出苹果
	 */
	public synchronized void popApple() {//需要声明同步方法才能获得该对象的锁
		for(int i=0;i<20;i++) {
			pop();
		}
	}
	
	
	/**
	 * 分四次放苹果
	 */
	public synchronized void pushApple() {//需要声明同步方法才能获得该对象的锁
		for(int i=0;i<20;i++) {
			Apples apples = new Apples(i);
			push(apples);
		}
	}
	
	/**
	 * 取出苹果
	 * @param apples
	 */
	public void pop() {
		if(basket.size() == 0) {//当篮子里面的苹果为0,通知并等待生产者来生产
			try {
				wait();//等待并释放当前该对象锁
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		try {
			Thread.sleep(500);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		System.out.println("取出"+basket.removeFirst().toString());
		notify();//通知生产者来生产
	}

	/**
	 * 存放苹果
	 * @param apples
	 */
	public void push(Apples apples) {
		if(basket.size() == 5) {//当篮子里面的苹果满了通知并等待消费者来消费
			try {
				wait();//等待并释放当前该对象锁
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		try {
			Thread.sleep(500);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		basket.addFirst(apples);
		System.out.println("存放"+apples.toString());
		notify();//通知消费者来消费
	}
	
}


class Apples{
	private int id;
	public Apples(int id) {//给每个苹果标号
		this.id = id ;
	}
	public String toString() {
		return "苹果"+(id+1);
	}
}

【运行结果】

存放苹果1
存放苹果2
存放苹果3
存放苹果4
存放苹果5
取出苹果5
取出苹果4
取出苹果3
取出苹果2
取出苹果1
存放苹果6
存放苹果7
存放苹果8
存放苹果9
存放苹果10
取出苹果10
取出苹果9
取出苹果8
取出苹果7
取出苹果6
存放苹果11
存放苹果12
存放苹果13
存放苹果14
存放苹果15
取出苹果15
取出苹果14
取出苹果13
取出苹果12
取出苹果11
存放苹果16
存放苹果17
存放苹果18
存放苹果19
存放苹果20
取出苹果20
取出苹果19
取出苹果18
取出苹果17
取出苹果16

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值