ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

生产者消费者阻塞队列版

2022-03-01 12:33:16  阅读:122  来源: 互联网

标签:Thread 队列 getName System 阻塞 生产者 println blockingQueue out


package com.atgu;

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

class MyResource{
    private volatile boolean FLAG=true;
    AtomicInteger atomicInteger=new AtomicInteger();
    BlockingQueue<String> blockingQueue=null;

    public MyResource(BlockingQueue<String> blockingQueue) {
        this.blockingQueue = blockingQueue;
        System.out.println("传入了---"+blockingQueue.getClass().getName());
    }

    public void myProducer() throws Exception{

        String date=null;
        boolean retVal;
        while (FLAG){
            date=atomicInteger.incrementAndGet()+"";
            retVal=blockingQueue.offer(date,2L,TimeUnit.SECONDS);
            if (retVal)
            {
                System.out.println(Thread.currentThread().getName()+date+"  插入成功");
            }
            else
            {
                System.out.println(Thread.currentThread().getName()+date+"  插入失败");
            }
            try {
                            TimeUnit.SECONDS.sleep(1);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }



        }
        System.out.println(Thread.currentThread().getName() + "\t 停止生产,表示FLAG=false,生产结束");




    }

    public void myConsumer() throws Exception{

        String result=null;

        while (FLAG){
            result=blockingQueue.poll(2,TimeUnit.SECONDS);


            if (result!=null&&result!="")
            {
                System.out.println(Thread.currentThread().getName()+result+"  取出成功");
            }
            else
            {
                FLAG=false;
                System.out.println(Thread.currentThread().getName()+"\t消费失败,队列中已为空,退出");
                return;
            }

        }

    }

    public void stop(){
        FLAG=false;
    }


}
public class ProducerConsumerWithBlockingQueueDemo {
    public static void main(String[] args) {
        MyResource myResource = new MyResource(new ArrayBlockingQueue<String>(10));

        new Thread(()->{
            System.out.println(Thread.currentThread().getName() + "\t 生产线程启动\n\n");
            try {
                myResource.myProducer();
            } catch (Exception e) {
                e.printStackTrace();
            }
        },"producer").start();
        new Thread(()->{
            System.out.println(Thread.currentThread().getName() + "\t 消费线程启动\n\n");
            try {
                myResource.myConsumer();
            } catch (Exception e) {
                e.printStackTrace();
            }
        },"consumer").start();

        try {
                        TimeUnit.SECONDS.sleep(5);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
        System.out.println("\n\n5秒中后,生产和消费线程停止,线程结束");
        myResource.stop();


    }
}

 

标签:Thread,队列,getName,System,阻塞,生产者,println,blockingQueue,out
来源: https://www.cnblogs.com/upupup-999/p/15949587.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有