ThreadPoolExecutor代替new Thread创建异步单线程
Posted ispotu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ThreadPoolExecutor代替new Thread创建异步单线程相关的知识,希望对你有一定的参考价值。
阿里p3c代码规范不允许使用new Thread创建线程,也不推荐使用Executors,推荐使用ThreadPoolExecutor来手动创建线程池。
方式1:corePoolSize设置为0,workQueue使用SynchronousQueue
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(0, 1, 60,
TimeUnit.SECONDS, new SynchronousQueue<>(),
new NamedThreadFactory("thread-pool-%d", false),
new ThreadPoolExecutor.AbortPolicy());
try
threadPoolExecutor.submit(() ->
log.info(Thread.currentThread().getName()+"开始异步线程...");
try
//do something
catch (Exception e)
log.error("异步线程...失败", e);
);
catch (Exception e)
threadPoolExecutor.shutdown();
方式2:corePoolSize设置为0,但要设置allowCoreThreadTimeOut(默认值为false)为true
threadPoolExecutor.allowCoreThreadTimeOut(true);
workQueue使用SynchronousQueue
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 60,
TimeUnit.SECONDS, new SynchronousQueue<>(),
new NamedThreadFactory("thread-pool-%d", false),
new ThreadPoolExecutor.AbortPolicy());
//核心线程超过KeepAliveTime 60s时会关闭核心线程,即线程池销毁
threadPoolExecutor.allowCoreThreadTimeOut(true);
try
threadPoolExecutor.submit(() ->
log.info(Thread.currentThread().getName()+"开始异步。。。");
try
// do something
catch (Exception e)
log.error("异步...失败", e);
);
catch (Exception e)
threadPoolExecutor.shutdown();
ThreadPoolExecutor执行顺序:
线程池按以下行为执行任务
- 当线程数小于核心线程数时,创建线程。
- 当线程数大于等于核心线程数,且任务队列未满时,将任务放入任务队列。
- 当线程数大于等于核心线程数,且任务队列已满
- 若线程数小于最大线程数,创建线程
- 若线程数等于最大线程数,抛出异常,拒绝任务
1、当核心线程数为0的时候,会创建一个非核心线程进行执行
2、keepAliveTime:线程空闲时间
- 当线程空闲时间达到keepAliveTime时,线程会退出,直到线程数量=corePoolSize
- 如果allowCoreThreadTimeout=true,则会直到线程数量=0
如果任务执行完毕又没有新的任务到来,corePoolSize=0,
线程池里的线程都将消亡,而且没有核心线程阻止线程池关闭,因此线程池也将随之自动关闭。
如果将corePoolSize
设置为大于0的数字,再运行以上代码,那么线程池将一直处于等待状态而不能关闭,因为核心线程不受keepAliveTime
控制,所以会一直存活,程序也将一直不能结束。
参考:Java 线程池会自动关闭吗|转 - 走看看分享Java 线程池自动关闭机制,推荐在创建任务后手动关闭线程池。http://t.zoukankan.com/east7-p-15679058.html
以上是关于ThreadPoolExecutor代替new Thread创建异步单线程的主要内容,如果未能解决你的问题,请参考以下文章
ThreadPoolExecutor代替new Thread创建异步单线程
ThreadPoolExecutor代替new Thread创建异步单线程
JUC并发编程 共享模式之工具 线程池 JDK 提供的线程池工具类 -- ThreadPoolExecutor(提交任务: submitexecute invokAllinvokeAny)