Executors的newSingleThreadExecutor()和newFixedThreadPool(1)有什么区别?
Executors的newSingleThreadExecutor()和newFixedThreadPool(1)有什么区别?
参考了一些文章,都说newSingleThreadExecutor()
主要有两个特性:
- 能保证执行顺序,先提交的先执行。
- 当线程执行中出现异常,去创建一个新的线程替换之。
讲到和newFixedThreadPool(1)
的区别,都主要指出如下。
http://www.cnblogs.com/richaa...文章中:
和 newFixedThreadPool(1) 的区别在于,如果线程遇到错误中止,它是无法使用替代线程的。
http://blog.csdn.net/vking_wa...文章中:
如果当前线程意外终止,会创建一个新线程继续执行任务,这和我们直接创建线程不同,也和newFixedThreadPool(1)不同。
但经过我的实验(代码如下),得出两者都是一样的,都保证了1和2。
// ExecutorService executorService = Executors.newSingleThreadExecutor();
ExecutorService executorService = Executors.newFixedThreadPool(1);
executorService.execute(
() -> {
if (count == 100) {
thrownewIllegalStateException("handler exception");
}
System.out.println(Thread.currentThread()+" - testAsyncRunner1 run ... "+count);
}
);
运行结果:
Thread[pool-1-thread-1,5,main] - testAsyncRunner1 run ... 99
Exception in thread "pool-1-thread-1" java.lang.IllegalStateException: handler exception
at com.mxx.meal.common.core.async.AsyncHandlerFactoryTest.lambda$null$0(AsyncHandlerFactoryTest.java:32)
at com.mxx.meal.common.core.async.AsyncHandlerFactoryTest$$Lambda$2/830539025.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Thread[pool-1-thread-2,5,main] - testAsyncRunner1 run ... 101
创建newSingleThreadExecutor
的源码中,其实是在newFixedThreadPool(1)
的基础上包装了FinalizableDelegatedExecutorService
,请问下这个究竟有啥用?麻烦帮忙解答。
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
看了下FinalizableDelegatedExecutorService,就是多了个gc时停掉线程池的功能。
父类DelegatedExecutorService 基本就是个装饰器模式,调用传进来的ExecutorService实例方法。
所以这两个线程池类型是没什么区别的。
这是jdk8源码上面的注释,大体上的意思是
newSingleThreadExecutor
不能配置去重新加入线程;接下来 举个栗子
就是上面的意思
为什么呢?
看上面的代码
FinalizableDelegatedExecutorService extends DelegatedExecutorService
,而DelegatedExecutorService
的主要作用就是不暴露那么多方法,不让你配置线程池,至此,single就真的single了以上
lalala, i'm the express of nature