线程池阻塞队列手写源码分析

主方法开启线程

生产者生产连接 ,消费者获取连接
/**
 * 线程池阻塞队列
 */
public class Test {
    public static void main(String[] args) {
        BlockingQueue<String> blockingQueue = new LinkedBlockingQueue<String>(10);

        ProducerThread producerThread = new ProducerThread(blockingQueue);
        ConsumerThread consumerThread = new ConsumerThread(blockingQueue);

        Thread p = new Thread(producerThread);
        Thread c = new Thread(consumerThread);

        p.start();
        c.start();

        try {
            //等待10秒
            Thread.sleep(1000*10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        producerThread.stop();

    }
}

生产者线程

/**
 * 生产者添加队列
 */
class ProducerThread implements Runnable{

    public BlockingQueue<String> blockingQueue;
    public volatile Boolean FLAG = true;
    AtomicInteger atomicInteger =new AtomicInteger();

    public ProducerThread(BlockingQueue<String> blockingQueue){
        this.blockingQueue = blockingQueue;
    }

    @Override
    public void run() {
        System.out.println("生产者线程已经启动");

        try {
            while (FLAG){
                //i++的意思,保证安全
                String data = atomicInteger.incrementAndGet() +"";

                   boolean offer =  blockingQueue.offer(data,2, TimeUnit.SECONDS);
                   if (offer){
                       System.err.println("生产者存入队列成功!data:" + data);
                   }else {
                       System.err.println("生产者存入队列失败!data:" + data);
                   }
                Thread.sleep(1000);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            System.out.println("生产者生产结束");
        }


    }

    //线程停止
    public void stop(){
        this.FLAG = false;
    }
}

消费者线程

/**
 * 消费者消费队列
 */
class ConsumerThread implements Runnable{

    public BlockingQueue<String> blockingQueue;
    public volatile Boolean FLAG = true;
    AtomicInteger atomicInteger =new AtomicInteger();

    public ConsumerThread(BlockingQueue<String> blockingQueue){
        this.blockingQueue = blockingQueue;
    }


    @Override
    public void run() {
        System.out.println("消费者线程启动");
        try {
            while (FLAG){
                String data = blockingQueue.poll(2, TimeUnit.SECONDS);
                if (data == null){
                    System.out.println("超过两秒时间没有获取到");
                    FLAG = false;
                    return;
                }
                System.out.println("消费者获取队列data:"+data);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            System.out.println("消费结束");
        }

    }
}


引用的包

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

图片分析

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,887评论 1 32
  • 一、简历准备 1、个人技能 (1)自定义控件、UI设计、常用动画特效 自定义控件 ①为什么要自定义控件? Andr...
    lucas777阅读 10,644评论 2 54
  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 7,083评论 0 4
  • 一. 操作系统概念 操作系统位于底层硬件与应用软件之间的一层.工作方式: 向下管理硬件,向上提供接口.操作系统进行...
    月亮是我踢弯得阅读 11,224评论 3 28
  • Java-Review-Note——4.多线程 标签: JavaStudy PS:本来是分开三篇的,后来想想还是整...
    coder_pig阅读 5,612评论 2 17

友情链接更多精彩内容