ThreadPoolExecutor JDK线程池
来源:互联网 发布:mac给ios手机装 编辑:程序博客网 时间:2024/06/08 18:06
ExecutorService (具有服务生命周期的Executor) 是一个接口,用于执行线程的服务,有两个具体的实现类
ScheduledThreadPoolExecutor, ThreadPoolExecutor
ExecutorService的生命周期: ExecutorService有3种生命状态 运行,关闭,终止
ExecutorService创建时,处于运行状态
调用shutdown()处于关闭状态 (关闭状态时,已经被添加的方法仍会继续执行) isShutDown()返回true
调用shutdownNow()或者所有添加的线程执行完毕时,处于终止状态 isTerminate()返回true
ThreadPoolExecutor 构造方法
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), handler);
参数解释:
corePoolSize 线程池中维护的最少的线程数量,没有任务也会一直存活
maximumPoolSize 线程池中线程的最大数量
keepAliveTime 线程数量>corePoolSize 时,线程完成后,该线程回收的最大空闲时间
workQueue 线程池所使用的缓冲队列,通常为LinkedBlockingQueue
ThreadFactory 创建线程的工厂(接口,覆盖newThread(Runnable r)方法,返回一个自定义的Thread)
handler当线程数量大于maximumPoolSize时,拒绝任务的处理策略,默认ThreadPoolExecutor.AbortPolicy()
ThreadPoolExecutor对象调用 execute(Runnable) 方法 来执行一个线程
ThreadPoolExecutor对象可以由Executors类的静态方法获得,如下
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
newFixedThreadPool使用了有限的线程集来提交所执行的任务,直接从线程池中获取线程.
newCachedThreadPool线程池中corePoolSize为0,在需求中创建于所需数量相同的线程,然后回收时最大空闲时间为60s
newSingleThreadExecutor 就是线程数量为1的FixedThreadPool,如果提交了多个任务,这些任务将排队
ThreadPoolExecutor添加任务时的具体过程:
运行的线程数量小于corePoolSize时,添加并执行线程 继续添加Task....
等于corePoolSize时,放入workQueue 继续添加Task....
> corePoolSize workQueue已经放满 线程数量小于 maximumPoolSize.创建新线程执行 继续添Task....
> corePoolSize workQueue已经放满 maximumPoolSize也装满,新提交任务由Handler处理
(构造方法的最后一个参数)
Task未新添加...渐渐执行完毕
多余线程空闲时间超过keepAliveTime时,会关闭这部分线程,直到线程数量为corePoolSize
BlockingQueue<Runnable> 常用下面几种
SynchronousQueue (默认)直接提交线程,直接提交通常要求无界maximumPoolSizes 以避免拒绝新提交的任务
LinkedBlockingQueue 无界队列,将导致在所有 corePoolSize 线程都忙时新任务在队列中等待,创建的线程就不会超过 corePoolSize,maximumPoolSize的值也就无效了
ArrayBlockingQueue 有界队列,很难控制,队列大小和maximumPoolSizes要相互折中
RejectedExecutionHandler 有下面4种
ThreadPoolExecutor.AbortPolicy
抛出异常java.util.concurrent.RejectedExecutionException (和线程抛出异常不同,这个异常会影响到主线程)
ThreadPoolExecutor.CallerRunsPolicy
ThreadPoolExecutor来重试执行当前任务
ThreadPoolExecutor.DiscardOldestPolicy
取缔掉线程池中最后一个要执行的任务,并执行新传入的任务
ThreadPoolExecutor.DiscardPolicy
不做任何动作
0 0
- ThreadPoolExecutor JDK线程池
- jdk线程池-ThreadPoolExecutor机制
- jdk 线程池 threadPoolExecutor 源码剖析
- 0031 Java线程池(ThreadPoolExecutor)JDK源码解析【基础】
- JDK 源码解析 —— Executors ExecutorService ThreadPoolExecutor 线程池
- JDK源码走读之深入理解线程池(ThreadPoolExecutor)
- Java 线程池ThreadPoolExecutor
- 线程池 ThreadPoolExecutor
- Java 线程池ThreadPoolExecutor
- 线程池ThreadPoolExecutor
- 线程池ThreadPoolExecutor参数设置
- Java 线程池ThreadPoolExecutor
- ThreadPoolExecutor线程池
- JAVA线程池:ThreadPoolExecutor
- ThreadPoolExecutor 线程池
- JAVA线程池ThreadPoolExecutor
- JAVA线程池ThreadPoolExecutor
- ThreadPoolExecutor java 线程池
- 白话经典算法系列之十六 “基数排序”之数组中缺失的数字
- 微信移动应用接入开发, Android 授权微信登录获取openid,unionid等,score参数错误或者没有scope权限
- Map、Set、List、Queue、Stack的特点与用法2
- 【程序员养生】:养护肾脏
- poj1328(贪心)
- ThreadPoolExecutor JDK线程池
- 把一个类存放在硬盘,并通过代码读取类的信息,输出到屏幕上
- shell学习
- 关于iOS国际化(根据手机系统来切换语言) App支持多语言切换
- UIView显示图片
- 给多行文本添加 前标 1. 2. 3. 4. 5. 6. 7.
- NYOJ 60 谁获得了最高奖学金(结构体)
- 白话经典算法系列之十七 数组中只出现一次的数
- 阻止文档默认点击右键、选中功能及获取鼠标按键等