<线程池的误解> 重要!!!线程池没有提前创建线程!!!
先贴一个网上常见的对线程池的理解:
很多人也是这么理解的,但是真实情况是,以上结论的第1点是错误的,使用线程池不能减少创建和销毁线程的开销!
一开始我对线程池的理解是和上面图片中的结论一样的,然后就想着自己去写一个线程池,于是我提前创建了线程,然后准备在添加任务时再使用闲置的线程去执行。
就图中这一步时,我发现Thread没有对外提供设置target(要执行的任务)的api接口。
没有提供接口去设置target,怎么在创建了线程之后去执行target ???
于是,我带着上面的疑问去看了线程池(ThreadPoolExecutor)的源码,然后找到了玄机!!!
以下是TheadPoolExecutor的addWorker方法中的部分,重点就是 " new Worker()"
进入到 new worker()的构造方法
实际上是调用 threadFactory重新new了一个线程出来,threadFactory是个接口,有多个实现类,随便点一个能看到类似下面的代码:
所以,到这里可以最终确定线程池并没有如网上流传的那样使用闲置线程。
为什么不能先创建线程再设置要执行的任务了? ??
我后来猜想了一下:线程实质是内存的一部分,如果先开辟一段内存作为线程,后面再设置要执行的任务,那么在实际运行时可能会发生实际需要的内存大于已经使用的内存的情况。所以,为了避免这种情况,就设计了创建线程时必须明确指定要执行的任务。
上面这个猜想只是我的个人想法,希望有朋友能一起交流一下,以便确定线程不能后指定任务的真正原因。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战