在上一篇【线程池】深入理解Executors类时,提到了newSingleThreadExecutor和newFixedThreadPool(1)的区别,查阅了大量资料,自己也做了一些实验,但是还是有很多不清楚的地方,这篇文章主要是用作讨论,如果有大佬有好的回答,拜托请多多指教。
大部分博客中都提到两点:1、Single方法可以保证线程执行顺序,采用FIFO,先提交的任务先执行,而Fixed(1)不保证。
2、在Single方法中,当线程执行出现异常时,它会重新创建一个线程替换之前的线程继续执行,而Fixed(1)不行。
针对上面两点,我做了实验,结果如下:
1、执行顺序
工具类:
public class ThreadPoolUtil implements Runnable{
private Integer index;
public ThreadPoolUtil(Integer index) {
this.index = index;
}
@Override
public void run() {
try {
System.out.println(index+"开始处理线程!");
Thread.sleep(50);
System.out.println("线程标识是:"+this.toString());
//System.out.println(index+"处理结束!");
}
catch(InterruptedException e) {
e.printStackTrace();
}
}
}
创建newSingleThreadExecutor线程池类:
ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();
System.out.println("---------------newSingleThreadExecutor--------------");
for(int i = 0; i < 200; i++) {
final int index = i;
newSingleThreadExecutor.execute(new ThreadPoolUtil(index));
}
结果:全部按顺序运行。
创建newFixedThreadPool线程池类:
ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(1);
System.out.println("------------newFixedThreadPool-------------");
for(int i = 0; i < 1000; i++) {
final int index = i;
newFixedThreadPool.execute(new ThreadPoolUtil(index));
}
结果:也是按顺序执行。
不知道是不是我验证方法有误,1000以内都是按照顺序执行的,和newSingleThreadExecutor没有区别。
2、线程执行出现异常
创建newSingleThreadExecutor线程池类:
ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();
System.out.println("---------------newSingleThreadExecutor--------------");
for(int i = 0; i < 100; i++) {
final int index = i;
newSingleThreadExecutor.execute(()->{
if(index == 20) {
throw new IllegalStateException(&#