最近在学习线程池遇到一个有意思的问题,在这里记录一下,若大佬们觉得不够精准欢迎留言私信!
查看newSingleThreadPool()源码如下图:
注释中被圈中的大概意思是指newSingleThreadPool()与newFixedThreadPool(1)的不同,前者线程池中的线程数量是不可重新配置的,也即不能去加入额外的线程。
这具体是指什么意思呢?
接下来我们看一下newFixedThreadPool(1)的源码如下图:
对比两者的源码可以看出newSingleThreadPool的实现相当于在newFixedThreadPool(1)上包装了一个new FinalizableDelegatedExecutorService()。那这个一个步骤主要用来干什么呢?查看其源码:
可以看出FinalizableDelegatedExecutorService继承自 DelegatedExecutorService,下面给出要讨论的几个service的关系图:
DelegatedExecutorService中只有线程池的基础操作,不包含比如setCorePoolSize设置核心线程池大小这些方法,所以newSingleThreadPool是没有办法重新配置线程池大小的,但是newFixedThreadPool(1)可以,测试代码如下:
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
/**
* @author ylei1
* @date 2020-05-28 20:09
*/
public class RunnableDemo implements Runnable {
public static void main(String[] args) {
ThreadPoolExecutor fixedThreadPool1 =(ThreadPoolExecutor) Executors.newFixedThreadPool(1);
//ThreadPoolExecutor singleThreadExecutor =(ThreadPoolExecutor) Executors.newSingleThreadExecutor();
//singleThreadExecutor.setCorePoolSize(5);
RunnableDemo demo = new RunnableDemo();
for (int i = 0; i < 5 ; i++) {
fixedThreadPool1.submit(demo);
}
fixedThreadPool1.shutdown();
while(true){
if(fixedThreadPool1.isTerminated()){
System.out.println("fixedThreadPool1 结束");
break;
}
}
ThreadPoolExecutor fixedThreadPool3 =(ThreadPoolExecutor) Executors.newFixedThreadPool(1);
fixedThreadPool3.setCorePoolSize(3);
for (int i = 0; i < 5 ; i++) {
fixedThreadPool3.submit(demo);
}
fixedThreadPool3.shutdown();
}
@Override
public void run() {
String threadName = Thread.currentThread().getName();
System.out.println("子线程"+ threadName +" 开启");
try {
Thread.sleep(3000);
}catch (InterruptedException ex){
System.out.println(threadName+"异常");
}finally {
System.out.println("子线程"+ threadName +" 结束");
}
}
}
运行结果如下:
将代码中newFixedThreadPool换成newSingleThreadExecutor则会报错如下:
所以也就解释了开头我们源码红框圈中的注释的意思。
以上是个人学习中的一点感悟,如有不实欢迎大佬们留言私信纠正哈