BlockQueue 生产消费 不需要判断阻塞唤醒条件

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

/**
 *
 */
public class ProdConsumerBlockQueueDemo {

    public static void main(String[] args) {
        final MyResource myResource = new MyResource(new ArrayBlockingQueue<>(10));
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+"线程启动");

                try {
                    myResource.myProd();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        },"生产");
        thread.start();
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+"线程启动");
                try {
                    myResource.myConsumer();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        },"消费");
        thread1.start();

        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+"线程5秒钟后叫停,活动结束");
        myResource.stop(false);
    }
}
class MyResource{
     private volatile boolean FLAG = true;
     private AtomicInteger atomicInteger = new AtomicInteger();
     BlockingQueue blockingQueue = null;

    MyResource(BlockingQueue blockingQueue){
        this.blockingQueue = blockingQueue;
    }
    public void myProd() throws Exception{
        String data = "";
        boolean retValue;
        while (FLAG){
            data = atomicInteger.incrementAndGet() + "";
            retValue = blockingQueue.offer(data,2L, TimeUnit.SECONDS);
            if(retValue){
                System.out.println(Thread.currentThread().getName()+"插入队列"+data+"成功");

            }else {
                System.out.println(Thread.currentThread().getName()+"插入队列"+data+"失败");
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        };
        System.out.println(Thread.currentThread().getName() + " 大老板叫停了  表示flag=false,生产动作结束");

    }

    public void myConsumer() throws Exception{
        Object retValue = null;
        while (FLAG){
            retValue = blockingQueue.poll(2L, TimeUnit.SECONDS);
            if(null ==retValue ||retValue.equals("")){
                FLAG = false;
                System.out.println(Thread.currentThread().getName()+"超过2秒没有取到蛋糕,消费退出");
                return;
            }
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"队列蛋糕"+retValue+"成功");
        }
    }
    public void stop(boolean FLAG) {
        this.FLAG = FLAG;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值