26_线程池_ThreadPoolExecutor
【ThreadPoolExecutor简述】
无论是Executors类的newFixedThreadPool()、newSingleThreadExecutor(),还是newCachedThreadPool()方法,虽然看起来创建的线程有着完全不同的特点,期内部实现均使用了ThreadPoolExecutor实现。
下面展示一下Executors类中对应的以上几个静态方法的源码:
[ newFixedThreadPool()方法 ]

[ newSingleThreadExecutor()方法]

[ newCachedThreadPool()方法 ]

【ThreadPoolExecutor构造方法】
以上线程池的实现代码可以看到,他们都是ThreadPoolExecutor类的封装。
ThreadPoolExecutor类功提供了四个构造方法
public class ThreadPoolExecutor extends AbstractExecutorService {
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,
BlockingQueue<Runnable> workQueue);
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,
BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory);
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,
BlockingQueue<Runnable> workQueue,RejectedExecutionHandler handler);
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,
BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler);
}
【参数详解】
* courePoolSize
指定了线程池中的线程数量。默认情况下,线程池中没有任何线程,而是等待有任务到来才去创建线程并执行任务,除非调用了prestartAllCoreThreads()或者prestartCoreThread()方法,从这两个方法名字可以看出,就是预创建线程的意思,即在任务到来之前就创建了corePoolSize个线程或者1个线程。默认情况下,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务。当线程池的线程数目达到corePoolSize后,就会把达到的任务放到缓存队列当中。
* maximumPoolSize
指定了线程池中最大线程数量。它表示线程池最多能创建多少个线程。
* keepAliveTime
表示线程池中的线程没有任务执行时最多或保留多久时间会终止。
默认情况下,只有当线程池中的线程数大于corePoolSize时,keepAliveTime才会起作用,即超过corePoolSize的空闲线程,在多长的时间内,会被销毁。
* unit
参数keepAliveTime的时间单位,有7种取值
TimeUnit.DAYS; //天
TimeUnit.HOURS; //小时
TimeUnit.MINUTES; //分钟
TimeUnit.SECONDS; //秒
TimeUnit.MILLISECONDS; //毫秒
TimeUnit.MICROSECONDS; //微妙
TimeUnit.NANOSECONDS; //纳秒
* workQueue
一个阻塞任务队列,用来存储等待执行的任务,这个参数的选择非常重要,会对线程池的运行过程产生较大影响。
一般可以选择如下:
ArrayBlockingQueue; //使用较少
LinkBlockingQueue; //经常使用
SynchronousQueue; //经常使用
* threadFactory
线程工厂,主要用来创建线程,一般选择默认即可
* handler
拒绝策略,当任务太多时,如何拒绝任务。
一共有以下取值:
ThreadPoolExecutor.AbortPolicy //直接丢弃任务,抛出RejectedExecutionException异常,阻止系统工作
ThreadPoolExecutor.DiscardPolicy //丢弃任务,不予任何处理,不抛出异常
ThreadPoolExecutor.DiscardOldestPolicy //丢弃最老的一一个任务,即队列最前面的任务,然后重新尝试执行任务,并重复此过程
ThreadPoolExecutor.CallerRunsPolicy //由调用线程处理该任务
26_线程池_ThreadPoolExecutor的更多相关文章
- 26_多线程_第26天(Thread、线程创建、线程池)_讲义
今日内容介绍 1.多线程 2.线程池 01进程概念 A:进程概念 a:进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行, 即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能 ...
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
- C#多线程之线程池篇3
在上一篇C#多线程之线程池篇2中,我们主要学习了线程池和并行度以及如何实现取消选项的相关知识.在这一篇中,我们主要学习如何使用等待句柄和超时.使用计时器和使用BackgroundWorker组件的相关 ...
- C#多线程之线程池篇2
在上一篇C#多线程之线程池篇1中,我们主要学习了如何在线程池中调用委托以及如何在线程池中执行异步操作,在这篇中,我们将学习线程池和并行度.实现取消选项的相关知识. 三.线程池和并行度 在这一小节中,我 ...
- C#多线程之线程池篇1
在C#多线程之线程池篇中,我们将学习多线程访问共享资源的一些通用的技术,我们将学习到以下知识点: 在线程池中调用委托 在线程池中执行异步操作 线程池和并行度 实现取消选项 使用等待句柄和超时 使用计时 ...
- NGINX引入线程池 性能提升9倍
1. 引言 正如我们所知,NGINX采用了异步.事件驱动的方法来处理连接.这种处理方式无需(像使用传统架构的服务器一样)为每个请求创建额外的专用进程或者线程,而是在一个工作进程中处理多个连接和请求.为 ...
- Java线程池解析
Java的一大优势是能完成多线程任务,对线程的封装和调度非常好,那么它又是如何实现的呢? jdk的包下和线程相关类的类图. 从上面可以看出Java的线程池主的实现类主要有两个类ThreadPoolEx ...
- Android线程管理之ExecutorService线程池
前言: 上篇学习了线程Thread的使用,今天来学习一下线程池ExecutorService. 线程管理相关文章地址: Android线程管理之Thread使用总结 Android线程管理之Execu ...
- Android线程管理之ThreadPoolExecutor自定义线程池
前言: 上篇主要介绍了使用线程池的好处以及ExecutorService接口,然后学习了通过Executors工厂类生成满足不同需求的简单线程池,但是有时候我们需要相对复杂的线程池的时候就需要我们自己 ...
随机推荐
- 分布式文件系统之FastDFS
环境引入: 在一个大型的教育官网,会拥有大量优质的视频教程,并且免费提供给用户去下载,文件太多如果高效存储?用户访问量大如何保证下载速度?分布式文件系统是解决这些问题的有效方法之一 一.什么是文件系统 ...
- es6-函数的扩展
/* * 1:函数参数的默认值 * */ !(() => { function f(x, y = 1, z = 1, g = 1) { console.log(x, y, z, g);//1,1 ...
- springboot pom.xml文件
pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...
- javascript DOM相关语法
childNodes: 获取元素内的所有节点 包括文本节点:nodeType=3 , 元素节点:nodeType = 1 nodeType:它可以判断所有节点的类型 元素节点类型:1 文本节点:3 注 ...
- linux下,matplotlib遇到的相关问题以及解决方法
1.在linux下运行matplotlib程序时,matplotlib的安装. 根据不同的linux系统继续相关安装: Debian / Ubuntu : sudo apt-get install p ...
- 013-PaymentUtils工具类模板
package ${enclosing_package}; import java.io.UnsupportedEncodingException; import java.security.Mess ...
- oracle connect by用法
先用scott用户下的emp表做实验.emp表有个字段,一个是empno(员工编号),另一个是mgr(上级经理编号)下面是表中所有数据 1 select * from emp start with e ...
- WPF的RadioButton--单选框
1. 使用, 显示的内容改为Content属性 <RadioButton Content="boy"/> 2. 要使用分组,就是用 GroupName属性 <Ra ...
- Python基础(3) - 数据类型:3列表类型
Python 列表是序列对象,可包含任意的Python数据信息,如字符串.数字.列表.元组等.列表的数据是可变的,我们可通过对象方法对列表中的数据进行增加.修改.删除等操作.列表用[]包括起来的. 列 ...
- 自定义控件如何给特殊类型的属性添加默认值 z(转)
自定义控件如何给特殊类型的属性添加默认值 z 定义控件如何给特殊类型的属性添加默认值了,附自定义GroupBox一枚 标题有点那啥,但确实能表达我掌握此法后的心情. 写自定义控件时往往会有一个需求,就 ...