V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
trzzzz
V2EX  ›  Java

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

  •  
  •   trzzzz · 2023-10-01 17:50:15 +08:00 · 2069 次点击
    这是一个创建于 448 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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   ·   实用小工具   ·   2979 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 13:18 · PVG 21:18 · LAX 05:18 · JFK 08:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.