介绍生产者-消费者模式

public class Producer implements Runnable{
	
	/*Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。
	 * 而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。
	 * 这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。*/
	private volatile boolean isRunning = true;
	private BlockingQueue<PCData> queue;//内存缓冲区
	private static AtomicInteger count = new AtomicInteger();
	
	private static final int SLEEPTIME = 1000;
	
	public Producer(BlockingQueue<PCData> queue){
		this.queue = queue;
	}
	
	public void run(){
		PCData data = null;
		Random r = new Random();
		
		System.out.println("start producer id = "+Thread.currentThread().getId());
		
			while(isRunning){
				try {
					Thread.sleep(r.nextInt(SLEEPTIME));
					data = new PCData(count.incrementAndGet()); //构造任务数据
					System.out.println(data+" is put into queue");
					if(!queue.offer(data,2,TimeUnit.SECONDS)){//提交数据到缓冲区中
						System.out.println("failed to put data : "+data);
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
					Thread.currentThread().interrupt();
				}
				
			}
	}
	
	public void stop(){
		isRunning = false;
	}
	
}

public class Consumer implements Runnable{

	private BlockingQueue<PCData> queue;//缓冲区
	private static final int SLEEPTIME = 1000;
	
	public Consumer(BlockingQueue<PCData> queue){
		this.queue = queue;
	}
	
	public void run() {
		System.out.println("start Consumer id = "+Thread.currentThread().getId());
		Random r= new Random();  //随机等待时间
		while(true){
			try {
				PCData data = queue.take(); //从任务队列中提取任务
				if( null != data){
					int re = data.getData() * data.getData(); //计算平方
					System.out.println(MessageFormat.format("{0}*{1}={2}",data.getData(),data.getData(),re));
					Thread.sleep(r.nextInt(SLEEPTIME));
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
				Thread.currentThread().interrupt();
			}
		}
	}

}

public class PCData {

	private final int intData;
	public PCData(int d) {
		intData = d;
	}
	public PCData(String d){
		intData=Integer.valueOf(d);
	}
	public int getData(){
		return intData;
	}
	public String toString(){
		return "data:"+intData;
	}
}

public static void main(String[] args) throws InterruptedException{
		BlockingQueue<PCData> queue = new LinkedBlockingQueue<PCData> (10);//建立缓冲区
		/*建立生产者*/
		Producer producer1 = new Producer(queue);
		Producer producer2 = new Producer(queue);
		Producer producer3 = new Producer(queue);
		/*建立消费者*/
		Consumer consumer1 = new Consumer(queue);
		Consumer consumer2 = new Consumer(queue);
		Consumer consumer3 = new Consumer(queue);
		/*建立线程池*/
		ExecutorService service = Executors.newCachedThreadPool();
		/*运行生产者*/
		service.execute(producer1);
		service.execute(producer2);
		service.execute(producer3);
		Thread.sleep(10*1000);
		/*运行消费者*/
		service.execute(consumer1);
		service.execute(consumer2);
		service.execute(consumer3);
		
		Thread.sleep(10*1000);
		/*停止生产者*/
		producer1.stop();
		producer2.stop();
		producer3.stop();
		
		Thread.sleep(3000);
		service.shutdown();
	}


生产者消费者模式是一个经典的多线程设计模式,它为多线程之间的协作提供了良好的解决方案。生产者负责提交用户请求,消费者线程负责具体处理生产者提交的任务。生产者和消费者之间通过共享内存缓冲区进行通信。

    生产者消费者模式的核心组件是共享内存缓冲区,它作为生产者和消费者间的通信桥梁,避免了生产者和消费者之间的直接通信,从而将消费者和生产者进行解耦。生产者不需要知道消费者的存在,消费者也不需要知道生产者的存在。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值