美文网首页
线程池的基本结构以及实现原理

线程池的基本结构以及实现原理

作者: 米_8d62 | 来源:发表于2020-02-10 16:14 被阅读0次

线程池的基本结构

线程池主要线程和一个阻塞队列组成。

线程池的执行流程

大体流程

当一个任务提交到线程池时
第一步 会先判断线程池里的核心线程是否都在执行任务;如果有可用线程并且当前线程池中的核心线程数还小于 corePoolSize则创建线程使用,否则就进入下一个流程;
第二步 线程池判断工作队列是否已满,如果工作队列没有满,则将新提交的任务存储在这个工作队列里。如果工作队列满了,则进入下个流程;
第三步 判断线程池里的线程是否都处于工作状态,如果没有,查看一下当前线程数是否到达maximumPoolSize,如果还未到达,就继续创建线程。如果已经到达了,就交给RejectedExecutionHandler来决定怎么处理这个任务。

execute()方法

  public void execute(Runnable command) {
          if (command == null)
              throw new NullPointerException();
        //如果线程数大于等于基本线程数或者线程创建失败,将任务加入队列
          if (poolSize >= corePoolSize || !addIfUnderCorePoolSize(command)) {
           //线程池处于运行状态并且加入队列成功
              if (runState == RUNNING && workQueue.offer(command)) {
                  if (runState != RUNNING || poolSize == 0)
                      ensureQueuedTaskHandled(command);
              }
           //线程池不处于运行状态或者加入队列失败,则创建线程(创建的是非核心线程)
              else if (!addIfUnderMaximumPoolSize(command))
              //创建线程失败,则采取阻塞处理的方式
                 reject(command); // is shutdown or saturated
         }
     }

addIfUnderCorePoolSize()

private boolean addIfUnderCorePoolSize(Runnable firstTask) {
        Thread t = null;
        final ReentrantLock mainLock = this.mainLock;
        //阻塞锁
        mainLock.lock();
        try {
            if (poolSize < corePoolSize && runState == RUNNING)
                t = addThread(firstTask);
        } finally {
            mainLock.unlock();
        }
        if (t == null)
            return false;
        //启动线程
        t.start();
        return true;
    }

addThread()方法

private Thread addThread(Runnable firstTask) {
        Worker w = new Worker(firstTask);
        Thread t = threadFactory.newThread(w);
        if (t != null) {
            w.thread = t;
            workers.add(w);
            int nt = ++poolSize;
            if (nt > largestPoolSize)
                largestPoolSize = nt;
        }
        return t;
    }

相关文章

  • 线程池的基本结构以及实现原理

    线程池的基本结构 线程池主要线程和一个阻塞队列组成。 线程池的执行流程 当一个任务提交到线程池时第一步 会先判断线...

  • Java中线程池,你真的了解会用吗

    在《深入源码分析Java线程池的实现原理》这篇文章中,我们介绍过了Java中线程池的常见用法以及基本原理。 在文中...

  • 线程以及java线程池实现分享

    线程以及java线程池实现分享 线程简介 JDK线程池的工作原理 JDK线程池的实现细节 1.线程简介-由来 1....

  • 京东Java高级面试--摘录

    1.Java线程池的实现原理 2.线程是否可以共享。线程池如何实现线程共享的。 3.JVM的内存结构(主要是画Mo...

  • Android_AsyncTask源码解析

    实现原理: 线程池+Handler 用到的数据结构:LinkedBlockQueue, 这说明AsyncTask是...

  • 源码分析AsyncTask的工作原理

    一、AsyncTask原理介绍 AsyncTask的实现原理 = 线程池+ Handler 其中:线程池用于线程调...

  • 美团一面总结

    线程池的实现原理 参考: Java线程池实现原理及其在美团业务中的实践[https://tech.meituan....

  • 线程池的原理解析

    线程池的原理 上一篇介绍了为什么要使用线程,以及创建线程的的几种方式。接下来将详细介绍线程的实现原理。 由源码可知...

  • 线程池的原理

    参考 深入Java源码理解线程池原理 线程池是对CPU利用的优化手段 线程池使用池化技术实现,替他的实现还有连接池...

  • 万字长文:带你透彻理解“线程池”

    目标 【理解】线程池的基本概念 【理解】线程池工作原理 【掌握】自定义线程池 【应用】java内置线程池 【应用】...

网友评论

      本文标题:线程池的基本结构以及实现原理

      本文链接:https://www.haomeiwen.com/subject/jqxnxhtx.html