ThreadPoolExecutor 问题:线程数大于核心线程书,线程池中队列没有任务后,在等待 poll(keepAlive)后应当非核心线程会被销毁,但我的疑惑是他怎么判断是否是非核心线程,如果是核心线程的话应当不会销毁。

2023-10-01 17:50:15 +08:00
 trzzzz
2030 次点击
所在节点    Java
15 条回复
Helsing
2023-10-01 18:04:57 +08:00
看源码吧,其实并没有核心线程和非核心线程的区分,你设置了几个核心线程,线程池就在已经创建的线程中,保留几个线程不销毁,就这么简单。

核心线程和非核心线程就是一种线程。
lingalonely
2023-10-01 18:10:08 +08:00
不存在指定的核心线程,只要保持线程池的线程数到指定数量就行,其他多余的拿出来回收掉
trzzzz
2023-10-01 18:43:25 +08:00
谢谢
sujin190
2023-10-01 20:18:31 +08:00
最小线程数吧,你哪看的核心非核心?超过最小线程数的线程在超过空闲时间后销毁吧
trzzzz
2023-10-01 20:41:19 +08:00
@sujin190 线程池第一个参数 corePoolSize ,正常理解的话是核心线程数。寻思 core 也没最小的翻译把
Euthpic
2023-10-01 20:46:06 +08:00
让你来设计的话,你会关心一个线程是核心的还是非核心的吗?只需关心池内的线程数量就行。核心线程数,最大线程数,其实也就是这个池子的下界和上界而已
trzzzz
2023-10-01 20:51:15 +08:00
@Euthpic 看了源码,核心、最大只是逻辑概念,没有明确说先创建的就是核心线程,后面就是非核心线程,里面线程谁都可能在 keepAlive 后被回收
sujin190
2023-10-01 21:02:55 +08:00
@trzzzz 这命名有问题,线程都是一样的,其实就是线程池最小线程数的逻辑,和连接池最小连接数事一样的
trzzzz
2023-10-01 21:17:32 +08:00
@sujin190 我之前说的有点问题。看了一些博客和楼中其他人回答,所谓的核心线程数也就是线程池的最小线程数。druid 配置有最小最大连接数我想也和线程池的差不多
wzcloud
2023-10-01 21:28:19 +08:00
源码没有区分核心非核心,只是在执行方法时会传递一个 bool 值类型的参数,如果为 true,则调用队列的阻塞方法,否则调用超时等待方法(如果超时没获取到数据,则线程结束--相当于关闭了非核心线程)
Ericcccccccc
2023-10-01 21:49:18 +08:00
这就好像假设你需要身上保留 10 块钱, 你先有了 10 块后来又获得 10 块, 这下需要把 10 块花出去难道还要区分先获得的 10 块还是后获得的 10 块吗?
Belmode
2023-10-02 15:07:17 +08:00
corePoolSize 应该理解成“最少存活线程数”吧
ikas
2023-10-02 16:20:40 +08:00
需要配合 allowsCoreThreadTimeOut 参数
如果设置 false,那么 core 线程就是最开始的生成的那几个线程
trzzzz
2023-10-02 17:07:25 +08:00
@ikas 这不一定,满足销毁线程条件时,任何线程都有可能被销毁
ikas
2023-10-02 17:59:16 +08:00
设置 core size 为 0?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/978474

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX