ThreadPoolExecutor 问题:线程数大于核心线程书,线程池中队列没有任务后,在等待 poll(keepAlive)后应当非核心线程会被销毁,但我的疑惑是他怎么判断是否是非核心线程,如果是核心线程的话应当不会销毁。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
trzzzz
V2EX    Java

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

  •  
  •   trzzzz 2023-10-01 17:50:15 +08:00 2575 次点击
    这是一个创建于 789 天前的主题,其中的信息可能已经有所发展或是发生改变。
    15 条回复    2023-10-02 17:59:16 +08:00
    Helsing
        1
    Helsing  
       2023-10-01 18:04:57 +08:00 via iPhone
    看源码吧,其实并没有核心线程和非核心线程的区分,你设置了几个核心线程,线程池就在已经创建的线程中,保留几个线程不销毁,就这么简单。

    核心线程和非核心线程就是一种线程。
    lingalonely
        2
    lingalonely  
       2023-10-01 18:10:08 +08:00
    不存在指定的核心线程,只要保持线程池的线程数到指定数量就行,其他多余的拿出来回收掉
    trzzzz
        3
    trzzzz  
    OP
       2023-10-01 18:43:25 +08:00 via iPhone
    谢谢
    sujin190
        4
    sujin190  
       2023-10-01 20:18:31 +08:00 via Android
    最小线程数吧,你哪看的核心非核心?超过最小线程数的线程在超过空闲时间后销毁吧
    trzzzz
        5
    trzzzz  
    OP
       2023-10-01 20:41:19 +08:00
    @sujin190 线程池第一个参数 corePoolSize ,正常理解的话是核心线程数。寻思 core 也没最小的翻译把
    Euthpic
        6
    Euthpic  
       2023-10-01 20:46:06 +08:00 via Android
    让你来设计的话,你会关心一个线程是核心的还是非核心的吗?只需关心池内的线程数量就行。核心线程数,最大线程数,其实也就是这个池子的下界和上界而已
    trzzzz
        7
    trzzzz  
    OP
       2023-10-01 20:51:15 +08:00
    @Euthpic 看了源码,核心、最大只是逻辑概念,没有明确说先创建的就是核心线程,后面就是非核心线程,里面线程谁都可能在 keepAlive 后被回收
    sujin190
        8
    sujin190  
       2023-10-01 21:02:55 +08:00 via Android
    @trzzzz 这命名有问题,线程都是一样的,其实就是线程池最小线程数的逻辑,和连接池最小连接数事一样的
    trzzzz
        9
    trzzzz  
    OP
       2023-10-01 21:17:32 +08:00
    @sujin190 我之前说的有点问题。看了一些博客和楼中其他人回答,所谓的核心线程数也就是线程池的最小线程数。druid 配置有最小最大连接数我想也和线程池的差不多
    wzcloud
        10
    wzcloud  
       2023-10-01 21:28:19 +08:00
    源码没有区分核心非核心,只是在执行方法时会传递一个 bool 值类型的参数,如果为 true,则调用队列的阻塞方法,否则调用超时等待方法(如果超时没获取到数据,则线程结束--相当于关闭了非核心线程)
    Ericcccccccc
        11
    Ericcccccccc  
       2023-10-01 21:49:18 +08:00
    这就好像假设你需要身上保留 10 块钱, 你先有了 10 块后来又获得 10 块, 这下需要把 10 块花出去难道还要区分先获得的 10 块还是后获得的 10 块吗?
    Belmode
        12
    Belmode  
       2023-10-02 15:07:17 +08:00 via Android
    corePoolSize 应该理解成“最少存活线程数”吧
    ikas
        13
    ikas  
       2023-10-02 16:20:40 +08:00
    需要配合 allowsCoreThreadTimeOut 参数
    如果设置 false,那么 core 线程就是最开始的生成的那几个线程
    trzzzz
        14
    trzzzz  
    OP
       2023-10-02 17:07:25 +08:00
    @ikas 这不一定,满足销毁线程条件时,任何线程都有可能被销毁
    ikas
        15
    ikas  
       2023-10-02 17:59:16 +08:00
    设置 core size 为 0?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     821 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 20:21 PVG 04:21 LAX 12:21 JFK 15:21
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86