Java 多线程学习——生产者消费者简单实现

本文介绍了一个基于Java实现的生产者消费者模式案例。通过定义仓库类`Storage`来限制存储容量并利用同步机制确保生产和消费操作的正确执行。此外,还实现了`Producer`和`Consumer`两个线程类分别用于模拟生产者和消费者的行为。

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

Storage.java 仓库类
package threads;

import java.util.LinkedList;

public class Storage
{
    // 仓库最大存储量
    private final int MAX_SIZE = 100;

    // 仓库存储的载体
    private LinkedList<Object> list = new LinkedList<Object>();

    // 生产产品
    public void produce(String producer)
    {
        synchronized (list)
        {
            // 如果仓库已满
            while (list.size() == MAX_SIZE)
            {
                System.out.println("仓库已满,【"+producer+"】: 暂时不能执行生产任务!");
                try
                {
                    // 由于条件不满足,生产阻塞
                    list.wait();
                }
                catch (InterruptedException e)
                {
                    System.out.println("??");
                    return;
                }
            }

            // 生产产品            
            list.add(new Object());            

            System.out.println("【"+producer+"】:生产了一个产品\t【现仓储量为】:" + list.size());

            list.notifyAll();
        }
    }

    // 消费产品
    public void consume(String consumer)
    {
        synchronized (list)
        {
            //如果仓库存储量不足
            while (list.size()==0)
            {
                System.out.println("仓库已空,【"+consumer+"】: 暂时不能执行消费任务!");
                try
                {
                    // 由于条件不满足,消费阻塞
                    list.wait();
                }
                catch (InterruptedException e)
                {
                    System.out.println("InterruptedException");
                    return;
                }
            }
            
            list.remove();
            System.out.println("【"+consumer+"】:消费了一个产品\t【现仓储量为】:" + list.size());
            list.notifyAll();
        }
    }

    public LinkedList<Object> getList()
    {
        return list;
    }

    public void setList(LinkedList<Object> list)
    {
        this.list = list;
    }

    public int getMAX_SIZE()
    {
        return MAX_SIZE;
    }
}
Consumer.java 消费者类
package threads;

public class Consumer extends Thread
{
    private String consumer;
    private Storage storage;
    private volatile boolean flag = true; 

    public Consumer(Storage storage)
    {
        this.storage = storage;
    }
    
    public Consumer(Storage storage,String consumer)
    {
        this.storage = storage;
        this.consumer = consumer;
    }

    @Override
    public void run()
    {
        
        while(flag){
        	consume(consumer);
    		try {
			this.sleep(2000);
		} catch (InterruptedException e) {
			System.out.println("con");
		}
    	}
        System.out.println("线程"+"【"+consumer+"】"+"已终止");
       
    }

    public void consume(String consumer)
    {
        storage.consume(consumer);
    }

    public Storage getStorage()
    {
        return storage;
    }

    public void setStorage(Storage storage)
    {
        this.storage = storage;
    }

    public String getConsumer() {
        return consumer;
    }

    public void setConsumer(String consumer) {
        this.consumer = consumer;
    }
    public boolean isFlag() {
		return flag;
	}
	public void setFlag(boolean flag) {
		this.flag = flag;
	}
}
Producer.java 生产者类
package threads;

public class Producer extends Thread
{
    private String producer;
    private Storage storage;
    private volatile boolean flag = true; 

    
    public Producer(Storage storage)
    {
        this.storage = storage;
    }
    public Producer(Storage storage,String producer)
    {
        this.storage = storage;
        this.producer = producer;
    }

    @Override
    public void run()
    {
    	while(flag){
    		produce(producer);
    		try {
			this.sleep(4000);
		} catch (InterruptedException e) {
			System.out.println("pro");
		}
    	}
    	System.out.println("线程"+"【"+producer+"】"+"已终止");
    	
        
    }

    public void produce(String producer)
    {
        storage.produce(producer);
    }

    public String getProducer()
    {
        return producer;
    }

    public void setProducer(String producer)
    {
        this.producer = producer;
    }

    public Storage getStorage()
    {
        return storage;
    }

    public void setStorage(Storage storage)
    {
        this.storage = storage;
    }
    public boolean isFlag() {
		return flag;
	}
	public void setFlag(boolean flag) {
		this.flag = flag;
	}
}
Main.java 实现测试类
package threads;

public class Main {
	public static void main(String[] args){
		Storage s = new Storage();
		
		Producer p1 = new Producer(s,"生产者1");
		p1.start();
		
		Consumer con1 = new Consumer(s,"消费者1");
		con1.start();
		Consumer con2 = new Consumer(s,"消费者2");
		con2.start();
		
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		p1.setFlag(false);

		con1.setFlag(false);
		con2.setFlag(false);
		
		p1.interrupt();
		con1.interrupt();
		con2.interrupt();    //使用interrupt函数结束处于阻塞状态的线程
		
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		
		System.out.println("主线程已终止");
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值