最近在学习线程池遇到一个有意思的问题,在这里记录一下,若大佬们觉得不够精准欢迎留言私信! 查看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则会报错如下: 所以也就解释了开头我们源码红框圈中的注释的意思。 以上是个人学习中的一点感悟,如有不实欢迎大佬们留言私信纠正哈