美文网首页
线程池-4

线程池-4

作者: 01010100 | 来源:发表于2018-04-20 11:30 被阅读4次

runWorker方法相对比较简单,主要有个循环

try{

while (task != null || (task = getTask()) != null) {

    …

try {

        …

        task.run();

     } finally {

       task = null;

         …

    }

}

}finally {

       processWorkerExit(w,completedAbruptly);

}

可以看到task

!=null 即启动线程时传进来的第一个任务,执行完之后,runWorker并不会退出,而是线程复用继续getTask()从队列中获取任务,直至所有任务都执行完,getTask()返回空。

getTask()也比较简单,主要代码就是:

Runnable r = timed ?

workQueue.poll(keepAliveTime,

TimeUnit.NANOSECONDS) :

workQueue.take();

如果设置了超时就poll,否则就take()一直阻塞,直到从队列中获取到任务为止。一般情况,如果线程池数大于core的时候,需要回收(poll),线程数等于core时核心线程是不会被回收的,就一直阻塞等待任务加入队列。

processWorkerExit(w, completedAbruptly); 这个方法,是在所有任务都已执行完或发生异常时执行,completedAbruptly=true 表示异常退出,false表示正常退出。

processWorkerExit方法相对来说也挺好理解:

1、线程池完成任务数增加当前线程的完成任务数,workers集合移除当前worker

completedTaskCount += w.completedTasks;

workers.remove(w);

2、tryTerminate(); //尝试结束线程池

3、这时候线程池状态还是小于STOP:

如果当前线程是异常退出,则需要再启动一个线程继续去执行任务队列的任务;

正常退出逻辑:min:线程池最小空闲数,允许核心线程超时则为0,否则为核心线程池大小corePoolSize,而如果min=0并且任务列表不为空,则min=1即至少要保证一个线程来处理队列中的任务。if

(workerCountOf(c) >= min) 即当前线程池中的工作线程大于最小空闲数,就不用担心了,直接返回。否则就跟异常退出一样,需要再启动一个线程继续执行队列中的任务。总结一下就是以下三种情况需要新增一个Worker来替代原来的:

// 1. 用户执行的任务发生了异常

// 2. Worker数量比线程池基本大小要小

// 3. 阻塞队列不空但是没有任何Worker在工作

if (runStateLessThan(c, STOP)) {

       if(!completedAbruptly) {

              intmin = allowCoreThreadTimeOut ? 0 : corePoolSize;

              if(min == 0 && ! workQueue.isEmpty())

                     min= 1;

              if(workerCountOf(c) >= min)

                     return;// replacement not needed

       }

       addWorker(null,false);

}

相关文章

  • 线程池学习笔记

    1、线程池的定义 2、Executors创建线程池的方式 3、ThreadPoolExecutor对象 4、线程池...

  • 线程池

    1、为什么要使用线程池2、线程池的工作原理3、线程池参数4、阻塞队列5、饱和策略6、向线程池提交任务7、线程池的状...

  • 9.jdk线程池详解及实际运用

    4.线程池 参数 1)corePoolSize: 线程池的基本大小,当提交一个任务到线程池中,线程池会创建一个线程...

  • 大白话聊聊线程池的工作原理和核心参数

    目录 1、为啥要使用线程池 2、线程池的工作原理 3、线程池都用哪些核心参数 4. 有界队列下的线程池的工作流程 ...

  • Kevin Learn Android:线程池(ThreadPo

    简介 使用 4 种常见线程池 定长线程池(FixedThreadPool) 特点:只有核心线程 & 不会被回收、线...

  • pthread 创建的动态线程池

    组织结构: 1,缓存工作的任务池,任务节点 2,存储工作线程的池,线程节点 3,任务池投递到工作线程的线程 4,工...

  • java中4种常用线程池

    java中4种常用线程池 一、线程池 线程池:说白了,就是一种线程使用模式。线程过多会带来调度开销,进而影响整体性...

  • JDK多任务执行框架

    1、为什么要使用线程池?2、线程池有什么作用?3、说说几种常见的线程池及使用场景。4、线程池都有哪几种工作队列?5...

  • 线程池面试题

    1、为什么要使用线程池?2、线程池有什么作用?3、说说几种常见的线程池及使用场景。4、线程池都有哪几种工作队列?5...

  • Android基础(25)多线程(三) 线程池

    1)Java多线程引发的性能问题,怎么解决?2)线程池 。线程池有没有上限?3)Android线程有没有上限?4)...

网友评论

      本文标题:线程池-4

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