前言

上节讲了讲自定义线程池,今天我们来聊聊线程池框架,在实际开发中我们还是基本使用线程框架Executor给我们提供的一些工具类,Java提供的Executor都在JUC(java.util.concurrent)包下面,主要包括:线程池工厂类Executors,线程池实现类ThreadPoolExecutor等,今天呢我们主要聊聊Executors,看看通过Executors我们可以做什么?OK,不多说废话,我们马上进入今天的主题,让我们扬帆起航,开启今天的并发之旅吧。

什么是Executors?

Executors,扮演的是线程工厂的角色,一定要与Executor相区分开,Executors只是Executor框架中的一个工厂类而已,通过Executors我们可以创建特定功能的线程池(ThreadPoolExecutor),通过这句话你是不是对Executors和ThreadPoolExecutor的关系有了一定的认识,这两个都是Executor框架中的一部分(关于Executor框架的各个成员组成这里就先不做说明,今天主要是学会怎么使用线程工厂创建线程池)。

如何使用Executors?

线程池ThreadPoolExecutor通常都是通过Executors来创建的,我们可以根据自己的需求创建下面几种不同作用的线程池:

// 创建一个固定数量的线程池
ExecutorService ExecutorService1 = Executors.newFixedThreadPool(10);
// 返回一个可根据实际情况调整线程个数的线程池
ExecutorService ExecutorService2 = Executors.newCachedThreadPool();
// 创建一个线程数量为1的线程池
ExecutorService ExecutorService3 = Executors.newSingleThreadExecutor();
// 返回一个ScheduledExecutorService对象,该对象也是调用父类的线程池方法,类似newFixedThreadPool
ScheduledExecutorService ScheduledExecutorService = Executors.newScheduledThreadPool(5);

线程池的使用之前讲自定义线程池已经说过了,主要也就是:

  • execute向线程池提交任务

  • shutdown和shutdownNow关闭线程池

newFixedThreadPool:该方法返回一个固定数量的线程池,该方法的线程数量始终不变,当有任务提交时,若线程池中有空闲线程,则立即执行,若没有,则会被缓存在一个任务队列中等待有空闲的线程再去执行;(核心线程数等于最大线程数,默认空闲时间为0,空闲立马销毁),该方法有2个实现,我们看下面源码:

public static ExecutorService newFixedThreadPool(int nThreads) {return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());}public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(),threadFactory);}

再分别看下这2个方法在线程池中的实现:

// 我们会发现没有传入线程工厂的方法调用了一个默认的线程工厂
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue) {this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,Executors.defaultThreadFactory(), defaultHandler);}// 而有传入线程工厂的方法调用自己传入的线程工厂
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory) {this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,threadFactory, defaultHandler);}

newSingleThreadExecutor:创建一个线程数量为1的线程池,若空闲则执行,否则入队列等待被执行;(核心线程数量为1,最大线程数量也为1,空闲等待时间为0),该方法也有2个实现,一个带自定义的线程工厂,一个不带:

public static ExecutorService newSingleThreadExecutor() {return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()));}public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(),threadFactory));}

newCachedThreadPool:返回一个可根据实际情况调整线程个数的线程池,不限制最大线程数量,若有任务则没线程时则创建线程,每个线程空闲等待时间为60秒,60秒后如果该线程没有任务可执行,则被回收;(核心线程数量为0,最大线程数量为最大,空闲等待时间为60s)

public static ExecutorService newCachedThreadPool() {return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());}public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>(),threadFactory);}

本文由“壹伴编辑器”提供技术支持

newScheduledThreadPool:返回一个ScheduledExecutorService对象,该线程池可以指定线程数量

// 返回一个ScheduledExecutorService对象
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {return new ScheduledThreadPoolExecutor(corePoolSize);}// 调了父类super的方法里面还是一个ThreadPoolExecutor
public ScheduledThreadPoolExecutor(int corePoolSize) {super(corePoolSize, Integer.MAX_VALUE, 0, TimeUnit.NANOSECONDS,new DelayedWorkQueue());}
// 父类super中的ThreadPoolExecutor
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue) {this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,Executors.defaultThreadFactory(), defaultHandler);}

并发编程系列之线程池工厂类:Executors相关推荐

  1. 并发编程系列---【线程池七大核心参数】

    一.七大核心参数 1.corePoolSize                            核心线程数 2.maximumPoolSize                   最大线程池参数 ...

  2. 【JUC并发编程11】线程池

    文章目录 线程池 11.1 线程池概述 11.2 线程池架构 11.3 线程池使用方式 11.4 线程池底层原则 11.5 线程池的七个参数 11.6 线程池底层工作流程 11.7 自定义线程池 线程 ...

  3. 高并发编程基础(线程池基础)

    线程池简单基础介绍: Executor: Executor是Java工具类,执行提交给它的Runnable任务.该接口提供了一种基于任务运行机制的任务提交方法,包括线程使用详细信息,时序等等.Exec ...

  4. Java面试系列之并发编程专题-Java线程池灵魂拷问

    金三银四跳槽季即将来临,想必有些猿友已经蠢蠢欲动在做相关的准备了!在接下来的日子里,笔者将坚持写作.分享Java工程师在面试求职期间的方方面面,包括简历制作.面试场景复现.面试题解答.谈薪技巧 以及 ...

  5. [Java 并发编程实战] 设计线程安全的类的三个方式(含代码)

    发奋忘食,乐以忘优,不知老之将至.---<论语> 前面几篇已经介绍了关于线程安全和同步的相关知识,那么有了这些概念,我们就可以开始着手设计线程安全的类.本文将介绍构建线程安全类的几个方法, ...

  6. Java 并发编程之自定义线程池 ThreadPoolExecutor

    1)定义一个任务线程 public class Task implements Runnable {private String name;Task(String name) {this.name = ...

  7. Java并发编程之调度线程池

    调度线程池: 调度线程池是线程池类ThreadPoolExecutor的子类,复用了线程池的计算框架,主要用于解决任务在一定的时间间隔后重复执行的问题. 例子 public class Schedul ...

  8. 并发编程-concurrent指南-线程池ExecutorService的使用

    有几种不同的方式来将任务委托给 ExecutorService 去执行: execute(Runnable) submit(Runnable) submit(Callable) invokeAny(- ...

  9. 多线程与高并发 笔记,非面向初学者 二:java引用,高并发多线程容器,线程池

    网页右边,向下滑有目录索引,可以根据标题跳转到你想看的内容 如果右边没有就找找左边 上一节:JUC锁,一些面试题和源码讲解 1.引用 java引用共4种,强软弱虚 强引用:我们普通的new一个对象,就 ...

最新文章

  1. 【二级java】软件工程基础
  2. python是如何进行内存管理的
  3. 什么是restful风格?
  4. 皮一皮:充实的一天...
  5. 36 | 套路篇:怎么评估系统的网络性能?
  6. 回忆---中秋夜赴京城考OCP有感
  7. android 查找所有dialog_android 布局文件layout分组的简单使用
  8. 手机扣费软件大曝光 金山手机卫士帮您免费检测
  9. 基于SWMM及自主开发城市内涝一维二维耦合软件的复杂城市排水系统建模技术及在城市排涝、海绵城市等领域实践
  10. mysql 三角函数_三角函数公式
  11. excle2010 一张图上画两种类型的图:折线图+柱形图
  12. 《软件工程实践》第五次作业-WordCount进阶需求 (结对第二次)
  13. 系列教程--Linux基础--12--用户和组
  14. 爬虫 | 王者荣耀高清壁纸-单线程
  15. 分布式医疗大数据存储方案研究综述
  16. drools的简单入门案例
  17. fastapi python_fastapi安装及访问页面
  18. STM32F030F4P6-提高ADC采集精度
  19. 开源系列:AI对抗攻防算法开源平台,哪家强?
  20. java计算机毕业设计好物网站源码+mysql数据库+系统+lw文档+部署

热门文章

  1. 统计单词个数-初学C语言-上海大学题库
  2. PAT 1104 天长地久 (20 分) C语言
  3. IDEA修改背景颜色为护眼绿
  4. VNote | Markdown 幂/上标下标/数学公式
  5. 华为被《麻省理工科技评论》评为全球“50家最聪明的公司”
  6. 0002 真的吗,700元的电脑可以学会编程?
  7. dell服务器从u盘启动装系统,dell r720服务器 怎么从u盘启动
  8. Windows sshfs挂载远程文件夹
  9. win10在命令行运行C\C++程序
  10. 解决Edge浏览器使用了Infinity插件后仍被hao123绑定的问题