先贴一个网上常见的对线程池的理解:
很多人也是这么理解的,但是真实情况是,以上结论的第1点是错误的,使用线程池不能减少创建和销毁线程的开销!
一开始我对线程池的理解是和上面图片中的结论一样的,然后就想着自己去写一个线程池,于是我提前创建了线程,然后准备在添加任务时再使用闲置的线程去执行。
就图中这一步时,我发现Thread没有对外提供设置target(要执行的任务)的api接口。
没有提供接口去设置target,怎么在创建了线程之后去执行target ???
于是,我带着上面的疑问去看了线程池(ThreadPoolExecutor)的源码,然后找到了玄机!!!
以下是TheadPoolExecutor的addWorker方法中的部分,重点就是 " new Worker()"
进入到 new worker()的构造方法
实际上是调用 threadFactory重新new了一个线程出来,threadFactory是个接口,有多个实现类,随便点一个能看到类似下面的代码:
所以,到这里可以最终确定线程池并没有如网上流传的那样使用闲置线程。
为什么不能先创建线程再设置要执行的任务了? ??
我后来猜想了一下:线程实质是内存的一部分,如果先开辟一段内存作为线程,后面再设置要执行的任务,那么在实际运行时可能会发生实际需要的内存大于已经使用的内存的情况。所以,为了避免这种情况,就设计了创建线程时必须明确指定要执行的任务。
上面这个猜想只是我的个人想法,希望有朋友能一起交流一下,以便确定线程不能后指定任务的真正原因。