一、Java线程池类/接口关系图及作用

  • Executor接口:只有一个方法execute(Runnable command),用来执行用户的任务线程。
  • ExecutorService接口:继承自Executor接口,并进行扩充扩充,主要添加了shutdown()/isShutdown(),submit(Callabletast)/submit(Rannable task),invokeAll(Collection<? extends Callable> tasks),invokeAny(Collection<? extends Callable> tasks)等方法。
  • AbstractExecutorService抽象类:此抽象类实现了ExecutorService中的submit,invokeAll,invokeAny等提交任务方法,execute和shutdown等方法线程控制推迟到了其子类ThreadPoolExecutor中实现。
  • ThreadPoolExecutor类:线程池的主要实现类,实现了execute和shutdown等方法。提供了一组构造器,主构造器为

ThreadPoolExecutor(int corePoolSize,                   // 核心线程数int maximumPoolSize,                // 线程池最大线程数long keepAliveTime,                 // 空闲线程等待任务的最长时间。TimeUnit unit,                      // 时间单位BlockingQueue workQueue,  // 任务队列ThreadFactory threadFactory,        // 线程创建工厂RejectedExecutionHandler handler)   // 线程池饱和处理策略
  • Executors类:线程池工厂类,通过设置不同的ThreadPoolExecutor构造器的参数,提供一系列的线程池,有newFixedThreadPool,newCachedThreadPool,newSingleThreadExecutor,newWorkStealingPool(通过ForkJoinPool类提供)newSingleThreadScheduledExecutor/newScheduledThreadPool(通过ScheduledThreadPoolExecutor提供,ScheduledThreadPoolExecutor继承自ThreadPoolExecutor并实现了ScheduledExecutorService接口)。

二、线程池基础类ThreadPoolExecutor构造器参数

  

  • int corePoolSize: 线程池中的线程数量,对于newCachedThreadPool方法,corePoolSize的初始值为0,对于newFixedThreadPool(int nThreads)方法,初始值为其参数nThreads,即开始就创建nThreads个线程。
  • int maximumPoolSize:线程池中线程最大值,如在newCachedThreadPool中,值为Integer.MAX_VALUE,对于newFixedThreadPool(int nThreads),最大值nThreads。
  • long keepAliveTime:线程池中线程空闲后,线程的等待时间。如果在等待期间没有任务加入,则时间到达后线程池回收线程。
  • TimeUnit unit:等待时间单位
  • BlockingQueue workQueue:任务队列,用于存放等待执行的任务,通常有如下几种实现[2]:
    • SynchronousQueue 直接提交:newCachedThreadPool任务队列的实现,将任务直接提交而不保存,SynchronousQueue是一个不存储元素的阻塞队列。每一个put操作必须等待一个take操作,因此线程池中如果不存在可用于直线任务的空闲线程,则新创建线程并运行。当命令以超过队列所能处理的平均数连续到达时,此策略允许无界线程具有增长的可能性。队列本身并不存储任何元素,非常适合于传递性场景,比如在一个线程中使用的数据,传递给另外一个线程使用,SynchronousQueue的吞吐量高于LinkedBlockingQueue 和 ArrayBlockingQueue[3]。
    • LinkedBlockingQueue 无界队列:newFixedThreadPool,newSingleThreadExecutor线程池任务队列的实现。当线程池中没有可用线程时,新提交的任务将被加入到工作队列,等待有可用的空闲线程。
    • ArrayBlockingQueue 有界队列:是一个基于数组结构的有界阻塞队列,此队列按 FIFO(先进先出)原则对元素进行排序。
  • ThreadFactory threadFactory:线程工厂,ThreadPoolExecutor提供了默认的实现DefaultThreadFactory。
  • RejectedExecutionHandler handler:处理当线程池和任务队列均满时的策略,默认使用AbortPolicy,即直接抛出异常。
    以下是JDK1.5提供的四种策略[1]:

    • AbortPolicy:直接抛出异常。
    • CallerRunsPolicy:只用调用者所在线程来运行任务。
    • DiscardOldestPolicy:丢弃队列里最近的一个任务,并执行当前任务。
    • DiscardPolicy:不处理,丢弃掉。
    • 当然也可以根据应用场景需要来实现RejectedExecutionHandler接口自定义策略。如记录日志或持久化不能处理的任务。

  参考:http://leekai.me/java-threadpool/

  

转载于:https://www.cnblogs.com/qunan/p/7717446.html

Java线程池—ThreadPool简介相关推荐

  1. Java线程池ThreadPool详解

    Java线程池ThreadPool详解 1. 线程池概述 1.1 线程池简介 1.2 线程池特点 1.3 线程池解决问题 2. 线程池原理分析 2.1 线程池总体设计 2.6 线程池流转状态 2.2 ...

  2. java线程池(ThreadPool)

    (1)自定义 ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, ...

  3. Java线程池(ThreadPool)详解

    线程五个状态(生命周期): 线程运行时间 假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间. 如果:T1 + T3 远大于 T2,则可以采用线 ...

  4. java 线程池 简介

    线程的实现方式 java 多线程之 extends Thread java 多线程之 implements Runnable java 多线程之 implements Callable 线程池的使用 ...

  5. Java核心(二)深入理解线程池ThreadPool

    本文你将获得以下信息: 线程池源码解读 线程池执行流程分析 带返回值的线程池实现 延迟线程池实现 为了方便读者理解,本文会由浅入深,先从线程池的使用开始再延伸到源码解读和源码分析等高级内容,读者可根据 ...

  6. Java提高班(二)深入理解线程池ThreadPool

    本文你将获得以下信息: 线程池源码解读 线程池执行流程分析 带返回值的线程池实现 延迟线程池实现 为了方便读者理解,本文会由浅入深,先从线程池的使用开始再延伸到源码解读和源码分析等高级内容,读者可根据 ...

  7. Java线程池系列--线程池的种类(Executors的用法)

    原文网址:Java线程池系列--线程池的种类(Executors的用法)_IT利刃出鞘的博客-CSDN博客 简介 说明 线程池是Java多线程常用的技术,本文介绍线程池的种类,用示例介绍其用法. 相关 ...

  8. 线程池(ThreadPool)

    线程池ThreadPool 1.线程池简介 2.线程池参数说明(重点) 2.1 常用参数说明 2.2 拒绝策略(重点) 3.线程池底层工作原理 4.入门案例 1.线程池简介   线程池(英语:thre ...

  9. Java线程池实现原理及其在美团业务中的实践

    来自:美团技术团队 随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流.使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器.J.U.C提供的线程池ThreadPoolExecuto ...

最新文章

  1. Asp.net MVC 示例项目Suteki.Shop分析之---结束篇
  2. 动态更改echarts 高度_EasyShu地图可视化新突破,ECharts图表完美集成
  3. MySQL高级 - 锁 - 锁的概述及分类
  4. Get和Post请求和对应的参数获取
  5. windows7下安装php的imagick和imagemagick扩展教程
  6. Cesium中常用的一些地理数据文件 以及数据相关的东西
  7. Frequent values
  8. 创业失败反思:吾亦有大错,错在哪里?
  9. [LeetCode]题解(python):067-Add Binary
  10. DBC文件编写概述 及 CANoe 使用DBC分析信号
  11. 【0门槛】PR稿的自我修养
  12. 字节跳动大数据中心17万服务器硬实力支撑今日头条等产品线(公号回复“字节跳动”下载PDF典型资料,欢迎转发、赞赏支持科普)
  13. 制作流程图用什么软件比较好?这些简单好用的制作软件推荐给你
  14. MCScanX使用说明
  15. 用selenium在python下实现批量网页 截图
  16. 解压命令tar zxvf中zxvf的意思
  17. 腾讯开放平台-QQ互联认证-未提交审核
  18. 编译Linux报错/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o: in function `_start‘:
  19. 【Linux】如何简单地进行PPPOE拨号连接/如何快速联网-nmtui
  20. 网易云音乐与QQ音乐的评测分析

热门文章

  1. C# async/await异步编程深入理解
  2. 如何解决js地址栏中传递中文乱码的问题
  3. 浅谈 Redis 与 MySQL 的耦合性以及利用管道完成 MySQL 到 Redis 的高效迁移
  4. 男人要走过几条路才称得上男子汉?
  5. (4)建立一个标准尺寸的平面,并对其进行着色贴图、拉伸一定的厚度
  6. 容灾服务器作用,存储容灾服务
  7. 小高考计算机知识点,小高考政治知识点总结.pdf
  8. 服务器装系统提示获取分区失败,u盘安装系统分区错误解决方法
  9. python groupby agg_Python数据分析:探索性分析
  10. 最新python招聘_重磅 | 最新报告:会Python竟成四大招人硬性指标?