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>()));
}
GCT1015
慕斯709654
相关分类