- ThreadPoolExecutor.AbortPolicy()
- ThreadPoolExecutor.CallerRunsPolicy()
- ThreadPoolExecutor.DiscardPolicy()
- ThreadPoolExecutor.DiscardOldestPolicy()
ThreadPoolExecutor执行流程如下
文章插图
①当新任务提交时 , 如果当前线程池中的线程数小于corePoolSize , 则创建新的线程处理 。
②如果线程池中的线程大于或等于corePoolSize , 且BlockingQueue未满 , 则将新任务加入BlockingQueue 。
③如果BlockingQueue已满 , 且线程池中的线程数小于maximumPoolSize , 则创建新的工作线程来执行任务 。
④如果当前运行的线程大于或等于maximumPoolSize , 将执行饱和策略 。即调用
RejectedExecutionHandler.rejectExecution()方法 。
几种常见的线程池Executors提供了一些静态工厂方法创建的常见线程池 。
- newFixedThreadPool
- newCachedThreadPool
- newSingleThreadExecutor
- newScheduledThreadPool
这几种线程池中 , newFixedThreadPool和newSingleThreadExecutor默认使用无线队列LinkedBlockingQueue 。newCachedThreadPool使用了同步移交队列SynchronousQueue 。newScheduledThreadPool使用了DelayedWorkQueue阻塞队列 。
newCachedThreadPool的corePoolSize为0 , maximumPoolSize为Integer.MAX_VALUE , 其他几种线程池corePoolSize与maximumPoolSize一样大 。
线程池的状态与生命周期线程池有5种状态 , 在ThreadPoolExecutor 源码中有定义 。
- RUNNING : 线程池最初创建后的初始状态 , 该状态的线程池既能接受新提交的任务 , 又能处理阻塞队列中任务 。
- SHUTDOWN: 调用shutdown()方法后进入该状态 。该状态的线程池不能接收新提交的任务 , 但是能处理阻塞队列中的任务 。
- STOP: 调用shutdownNow()方法后进入该状态 。该状态的线程池不接受新提交的任务 , 也不处理在阻塞队列中的任务 , 还会中断正在执行的任务 。
- TIDYING: 当所有的任务都已终止 , 工作线程数为0的状态 。线程池进入该状态后会调用 terminated() 钩子方法进入TERMINATED 状态 。
- TERMINATED: 在terminated()钩子方法执行完后进入该状态 。
文章插图
调用线程池的shutdown()或者shutdownNow()方法可以关闭线程池 , 遍历线程池中工作线程 , 逐个调用interrupt方法来中断线程 。
Shutdown()方法与shutdownNow()的特点:
Shutdown()方法将线程池的状态设置为SHUTDOWN状态 , 只会中断空闲的工作线程 。
shutdownNow()方法将线程池的状态设置为STOP状态 , 会中断所有工作线程 , 不管工作线程是否空闲 。
调用两者中任何一种方法 , 都会使isShutdown()方法的返回值为true;线程池中所有的任务都关闭后 , isTerminated()方法的返回值为true 。
通常使用shutdown()方法关闭线程池 , 如果不要求任务一定要执行完 , 则可以调用shutdownNow()方法 。
推荐阅读
- 金亚中|40岁金雅中被指脸僵 出道18年半隐退?与池城出演我的P.S.搭档
- 阳池穴穴位位置图及作用
- java jdk安装教程
- 长白山天池属于什么火山 长白山天池位于长白山主峰
- 行车记录仪电池常识
- 苹果手机如何开启电池百分比提醒 苹果的电池百分比怎么开
- java是什么?
- 铅酸电池和锂电池的区别是什么?
- 电池健康度对手机有什么影响 手机电池健康度有必要关注吗吗
- 华为手机电池旁仪表图标什么意思 怎么关闭