Java线程池—ThreadPool简介
一、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简介相关推荐
- Java线程池ThreadPool详解
Java线程池ThreadPool详解 1. 线程池概述 1.1 线程池简介 1.2 线程池特点 1.3 线程池解决问题 2. 线程池原理分析 2.1 线程池总体设计 2.6 线程池流转状态 2.2 ...
- java线程池(ThreadPool)
(1)自定义 ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, ...
- Java线程池(ThreadPool)详解
线程五个状态(生命周期): 线程运行时间 假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间. 如果:T1 + T3 远大于 T2,则可以采用线 ...
- java 线程池 简介
线程的实现方式 java 多线程之 extends Thread java 多线程之 implements Runnable java 多线程之 implements Callable 线程池的使用 ...
- Java核心(二)深入理解线程池ThreadPool
本文你将获得以下信息: 线程池源码解读 线程池执行流程分析 带返回值的线程池实现 延迟线程池实现 为了方便读者理解,本文会由浅入深,先从线程池的使用开始再延伸到源码解读和源码分析等高级内容,读者可根据 ...
- Java提高班(二)深入理解线程池ThreadPool
本文你将获得以下信息: 线程池源码解读 线程池执行流程分析 带返回值的线程池实现 延迟线程池实现 为了方便读者理解,本文会由浅入深,先从线程池的使用开始再延伸到源码解读和源码分析等高级内容,读者可根据 ...
- Java线程池系列--线程池的种类(Executors的用法)
原文网址:Java线程池系列--线程池的种类(Executors的用法)_IT利刃出鞘的博客-CSDN博客 简介 说明 线程池是Java多线程常用的技术,本文介绍线程池的种类,用示例介绍其用法. 相关 ...
- 线程池(ThreadPool)
线程池ThreadPool 1.线程池简介 2.线程池参数说明(重点) 2.1 常用参数说明 2.2 拒绝策略(重点) 3.线程池底层工作原理 4.入门案例 1.线程池简介 线程池(英语:thre ...
- Java线程池实现原理及其在美团业务中的实践
来自:美团技术团队 随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流.使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器.J.U.C提供的线程池ThreadPoolExecuto ...
最新文章
- Asp.net MVC 示例项目Suteki.Shop分析之---结束篇
- 动态更改echarts 高度_EasyShu地图可视化新突破,ECharts图表完美集成
- MySQL高级 - 锁 - 锁的概述及分类
- Get和Post请求和对应的参数获取
- windows7下安装php的imagick和imagemagick扩展教程
- Cesium中常用的一些地理数据文件 以及数据相关的东西
- Frequent values
- 创业失败反思:吾亦有大错,错在哪里?
- [LeetCode]题解(python):067-Add Binary
- DBC文件编写概述 及 CANoe 使用DBC分析信号
- 【0门槛】PR稿的自我修养
- 字节跳动大数据中心17万服务器硬实力支撑今日头条等产品线(公号回复“字节跳动”下载PDF典型资料,欢迎转发、赞赏支持科普)
- 制作流程图用什么软件比较好?这些简单好用的制作软件推荐给你
- MCScanX使用说明
- 用selenium在python下实现批量网页 截图
- 解压命令tar zxvf中zxvf的意思
- 腾讯开放平台-QQ互联认证-未提交审核
- 编译Linux报错/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o: in function `_start‘:
- 【Linux】如何简单地进行PPPOE拨号连接/如何快速联网-nmtui
- 网易云音乐与QQ音乐的评测分析
热门文章
- C# async/await异步编程深入理解
- 如何解决js地址栏中传递中文乱码的问题
- 浅谈 Redis 与 MySQL 的耦合性以及利用管道完成 MySQL 到 Redis 的高效迁移
- 男人要走过几条路才称得上男子汉?
- (4)建立一个标准尺寸的平面,并对其进行着色贴图、拉伸一定的厚度
- 容灾服务器作用,存储容灾服务
- 小高考计算机知识点,小高考政治知识点总结.pdf
- 服务器装系统提示获取分区失败,u盘安装系统分区错误解决方法
- python groupby agg_Python数据分析:探索性分析
- 最新python招聘_重磅 | 最新报告:会Python竟成四大招人硬性指标?