Executor -->  ExecutorService  -->  AbstractExecutorService --> ThreadPoolExecuotorExecutor接口,只有一个execute方法,参数为线程任务ExecutorService接口继承Executor接口,增加了submit、shutdown、invokeAll等方法AbstractExecutorService抽象类,实现ExecutorService接口,提供了submit、invokeAny、invokeAll默认实现方法, execute、
shutdown、shutdownNow等待没有提供默认的实现ThreadPoolExecutor线程池状态值---RUNNING  接受新任务并且处理阻塞队列里的任务---SHUTDOWN  拒绝信任务但是处理阻塞队列里的任务---STOP  拒绝新任务并且抛弃阻塞队列里的任务同时会中断正在处理的任务---TIDYING  所有任务都执行完当前线程池活动线程为0,将调用terminated方法---TERMINATED  终止状态构造函数---有四个构造函数,其他三个都是调用下面这个构造函数public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) {}---参数说明corePoolSize  核心线程数maximumPoolSize  最大线程数keepAliveTime  存活时间unit  时间单位workQueue  存放线程的队列threadFactory  创建线程的工厂handler  拒绝策略提交任务---submitpublic Future<?> submit(Runable task) {if(task == null) throw new NullPointerException();RunnableFuture<Void> ftask = newTaskFor(task, null);execute(ftask);return ftask;}       public <T> Future<T> submit(Runnable task, T result) {if(task == null) throw new NullPointerExecetion();RunnableFuture<T> ftask = newTaskFor(task, result);execute(ftask);return ftask;}public <T> Future<T> submit(Callable<T> task) {if(task == null) throw new NullPointerException();RunnableFuture<T> ftask = newTaskFor(task);execute(ftask);return ftask;}--- executepublic void execute(Runnable command) {if(command == null) throw new NullPointerException();//获取当前线程池的状态+线程个数int c = ctl.get();//判断当前线程池数量是否小于corePoolSize,小于则调用addWorker方法创建新线程运行,且传进来的Runnable当做第一个任务执行if(workerCountOf(c) < corePoolSize) {if(addWorker(command, true))return;c = ctl.get();    }//如果线程池处于Running状态,则添加任务到阻塞队列if(isRunning(c) && workQueue.offer(command)) {int recheck = ctl.get();//如果当前线程池状态不是Running则从队列删除任务,并执行拒绝策略if(!isRunning(recheck) && remove(command))reject(command);//如果当前线程池为空,则添加一个线程    else if(workercountOf(recheck) == 0) addWorker(null, false);    }//新增线程失败则执行拒绝策略else if(!addWorker(command, false))reject(command);}---addWorkerprivate boolean addWorder(Runnable firstTask, boolean core) {retry:for(;;) {int c = ctl.get();int rs = runStateOf(c);//检查当前线程池状态是否是shutdown、stop、tidying、terminated且!(当前状态为shutdown、传入的任务为null、队列不为null),条件都成立时返回falseif (rs >= SHUTDOWN &&! (rs == SHUTDOWN &&firstTask == null &&! workQueue.isEmpty()))return false;for(;;) {int wc = workerCountOf(c);if(wc >= CAPACITY || wc >= (core ? corePoolSize : maximumPoolSize) )return false;if(compareAndIncrementWorkerCount(c))break retry;c = ctl.get();if(runStateOf(c) != rs) continue retry;    }}boolean workerStarted = false;boolean workerAdded = false;Worker w = null;try{// new threadw = new Worker(firstTask);final Thread t = w.thread();if(t != null) {//lockfinal ReentrantLock mainLock = this.mainLock;mainLock.lock();try{//check thread pool stateint rs = runStateOf(ctl.get());if(rs < SHUTDOWN || (rs == SHUTDOWN && firstTask == null) ) {//检查线程是否可启动if(t.isAlive())throw new IllegalThreadStateException();workers.add(w)   ;int s = workers.size();if(s > largestPoolSize)largestPoolSize = s;workerAdded = true;    } }finally {mainLock.unlock();}//判断worker是否添加成功,成功则启动线程,将workerStarted设置为trueif(workerAdded) {t.start();workerStarted = true;}}}finally{if(!workerStarted) addWorkerFailed(w);}return workerStarted;}---runWorker,线程启动时调用了runWorker方法final void runWorker(Worker w) {Thread wt = Thread.currentThread();Runnable task = w.firstTask;w.firstTask = null;w.unlock();boolean completedAbruptly = true;try {//循环获取任务while(task != null || (task = getTask()) != null ) {w.lock();// 当线程池是处于STOP状态或者TIDYING、TERMINATED状态时,设置当前线程处于中断状态// 如果不是,当前线程就处于RUNNING或者SHUTDOWN状态,确保当前线程不处于中断状态// 重新检查当前线程池的状态是否大于等于STOP状态if ((runStateAtLeast(ctl.get(), STOP) ||(Thread.interrupted() &&runStateAtLeast(ctl.get(), STOP))) &&!wt.isInterrupted())wt.interrupt();try {beforeExecute(wt, task);Throwable thrown = null;try {task.run();}catch(RuntimeException x) {thrown = x; throw x;}catch(Error x) {thrown = x; throw x;}catch(Throwable x) {thrown = x; throw Error(x);}finally {afterExecute(taskm thrown);}}finally {task = null;w.completedTasks++;w.unlock();} }completedAbruptly = false;}finally {processWokerExit(w, completedAbruptly);}}---getTaskprivate Runnable getTask() {boolean timeOut = false;for(;;) {int c = ctl.get();int rs = runStateOf(c);if(rs >= SHUTDOWN && (rs >= STOP || workQueue.isEmpty() )) {decrementWorkerCount();return null;}int wc = workerCountof(c);boolean timed = allowCoreThreadTimeOut || wc > corePoolSize;//(当前线程数是否大于最大线程数或者)//且(线程数大于1或者任务队列为空)//这里有个问题(timed && timedOut)timedOut = false,好像(timed && timedOut)一直都是false吧if ((wc > maximumPoolSize || (timed && timedOut))&& (wc > 1 || workQueue.isEmpty())) {if (compareAndDecrementWorkerCount(c))return null;continue;}try{Runnable r = timed ? workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) : workQueue.take();if(r != null)return r;timedOut = true;    }catch(InterruptedException retry) {timedOut = false;}}}---shutdown 关闭线程池public void shutdown() {final ReentrantLock mainLock = this.mainLock;mainLock.lock();try{checkShutdownAccess();advanceRunState(SHUTDOWN);interruptIdleWorkers();onShutdown();}finally{mainLock.unlock();}tryTerminate();}

转载于:https://www.cnblogs.com/codechange/p/9254059.html

ThreadPoolExecuotor源码参考相关推荐

  1. STM32F4 CAN总线通信资料参考,提供源码参考快速上手CAN总线通信

    STM32F4 CAN总线通信资料参考,提供源码参考快速上手CAN总线通信,提供CAN1.CAN2通信这样便于在F4的一个板子学习 编号:489659239564198酱料的卡卡

  2. 如何秒下单?python的淘宝秒杀抢购下单源码参考

    如何秒下单?python的淘宝秒杀抢购下单源码参考 疫情如期,隔离还在继续,何时工作是一个头大的问题,最近在看口罩,不少电商平台都有放出口罩,当然,手残党将会也会是一直难以下手,你可能很难抢得到,故找 ...

  3. renren-fast后端源码参考-配置和对应工具

    1. renren-fast后端源码参考-配置和对应工具 1.1. 前言 renren-fast是个开源的前后端分离快速开放平台,没有自己框架的同学可以直接使用它的,而我打算浏览一遍它的代码,提取一些 ...

  4. 【Python-Microfilm-web-app-flask】基于Flask构建的微电影网站实例及源码参考

    前言 2019年5月20号,系统集成项目工程师考试结束,这个意味这今年的目标实现了一小部分,毕竟是一年多没有再参加考试,这次考试,又体会到了头脑风暴,考试这种活动,和编程不是一个层次.编程我可以有N种 ...

  5. Python与seo工具脚本,360/搜狗相关搜索词采集源码参考

    搜索引擎相关搜索词应该是不少seoer在寻找和选择使用的关键词拓展类别,除开热门的百度相关搜索词采集,当然还有360搜索引擎以及搜狗搜索引擎,当然知道方法以后,应用python来实现,基本都是大同小异 ...

  6. 100套java课设源码参考/毕设源码代码参考

    引言:本人是一个Java 开发者,喜欢分享Java课设源码和代码,用于课程设计或者作业学习参考噢,开发一些有技术含量的Java web源码,主要的技术有JSP+Servlet,SSM/SpringBo ...

  7. C# 读取保存App.config配置文件的完整源码参考

    最近出差在北京做一个小项目,项目里需要读取配置文件的小功能,觉得挺有参考意义的就把代码发上来给大家参考一下.我们选择了直接用微软的读取配置文件的方法. 这个是程序的运行设计效果,就是把这些参数可以进行 ...

  8. 记一次SQL Server2005导入Oracle10G的折腾过程【供多种数据库导入导出数据的C#程序源码参考】...

    曾经很早的时候用 SQL Server2000 时就见过我们老大,用 SQL Server2000 的导入导出功能,把数据都导入到了 Oracle9 里去,所以我也对导入导出数据有充分的信心,绝对能做 ...

  9. php一点按钮就下载功能源码,php实现强制文件下载方法的源码参考

    有时我们希望如图片.文本文档.网页.mp3.pdf等内容,当点击对应链接时直接下载,而不是在网页上显示,那么就需要强制设置header头信息.以下为一段不会产生乱码的php函数实现代码,其他程序语言也 ...

最新文章

  1. 利用python开源库制作并验证torrent种子文件
  2. java ftp client_JAVA FTP CLIENT
  3. 老李分享:Mac快捷键
  4. Docker Review - docker部署Tomcat Nginx
  5. 2018-06-22 第四十七天 oracle
  6. 【51CTO学院】搜索V2.0——新的搜索,只为给你更好的
  7. 如何给自己的个人博客添加一个呆萌的live-2d博客精灵/看板娘
  8. URLConnection学习
  9. bdm导入mysql_MySQL数据库导入教程
  10. 【一】高等数学上册第一章笔记。
  11. 随机产生四位,任意位或者范围数字方法
  12. 9.3 parity概述
  13. IP-Guard准入控制网关实现机制
  14. VB写的软件加壳都没用,超强反调试反破解分析,检测OD调试器
  15. 架构文摘:LSV负载均衡技术笔记
  16. 浅谈响应式开发与自适应布局!
  17. 介绍一个java的Excel处理工具
  18. 程序中unsigned char 类型的意义
  19. 【U盘主控芯片的优缺点】
  20. MySQL DDL--ghost工具学习

热门文章

  1. BASIC-5 查找整数
  2. Go语言生成区间随机数
  3. 01、python数据分析与机器学习实战——Python数据可视化库-Matplotlib
  4. 【数字图像】数字图像处理博客汇总
  5. 【Qt】Qt程序发布
  6. 【STM32】I2C详解
  7. 【Linux系统编程应用】 Linux系统中找不到设备/dev/fb0
  8. setwindowpos怎么改变z序_小学教材读音又改了,说服读成shuō fú,确凿改成què záo...
  9. 防火墙(5)——五表
  10. YUV2RGB源码详解(参考Opencv4.1)