月眸


生产者消费者模式代码练习(阻塞队列版)

毛毛小妖 2019-06-27 164浏览 0条评论
首页/ 正文
分享到: / / / /
package com.sy.concurrency;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

class MyResource{
	//标志位,值为true时开始生产消费活动,为false时停止活动
	private volatile boolean FLAG = true;
	
	//原子Integer,计数功能
	private AtomicInteger atomicInteger = new AtomicInteger();
	
	//定义阻塞队列接口,初始化为null,在构造函数中传入具体的实现类,可以由调用者来决定使用哪个实现类,增加了程序的灵活性
	private BlockingQueue<String> blockingQueue = null;
	
	public MyResource(BlockingQueue<String> blockingQueue) {
		this.blockingQueue = blockingQueue;
		System.out.println("当前使用的阻塞队列为:"+blockingQueue.getClass().getName());
		System.out.println();
	}

	public void prod() throws Exception{
		while(FLAG){
			TimeUnit.MILLISECONDS.sleep(1000);
			blockingQueue.offer(atomicInteger.getAndIncrement()+"", 2, TimeUnit.SECONDS);
			System.out.println(Thread.currentThread().getName()+"\t 生产了"+atomicInteger.get());
		}
	}
	
	public void consumer() throws Exception{
		String result = null;
		while(FLAG){
			TimeUnit.MILLISECONDS.sleep(500);
			result = blockingQueue.poll(2, TimeUnit.SECONDS);
			if(result==null || "".equals(result)){
				FLAG = false;
				return;
			}else{
				System.out.println(Thread.currentThread().getName()+"\t 消费了"+atomicInteger.get());
			}
		}
	}
	
	public void stop(){
		this.FLAG=false;
	}
}

public class ProdConsumerBlockingQueue {
	public static void main(String[] args) throws Exception {
		MyResource myResource = new MyResource(new ArrayBlockingQueue<>(10));
		new Thread(()->{
			try {
				myResource.prod();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}, "prod").start();
		
		new Thread(()->{
			try {
				myResource.consumer();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}, "consumer").start();
		
		TimeUnit.SECONDS.sleep(5);
		myResource.stop();
		TimeUnit.SECONDS.sleep(1);
		System.out.println();
		System.out.println("活动结束");
	}
}

 

最后修改:2019-06-27 10:00:46 © 著作权归作者所有
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付

上一篇

发表评论

说点什么吧~

评论列表

还没有人评论哦~赶快抢占沙发吧~