zoukankan      html  css  js  c++  java
  • 线程池中的线程何时死亡?

    本文产生的原因

    面试被问到了, 结果说的不清楚。

    回来看了下。

    结论

    查看从workQueue中getTask , 当非core线程空闲时间超过keepAliveTime, timeUnit指定的时间后,则退出

    (ps:超过空闲时间退出这个我是知道的,但是当时本能的认为不是问的这个,哭。。)

    Thread

    当Thread#run完毕后,就结束。

    线程状态

    NEW: new Thread()后
    RUNNABLE: thread.start()后
    RUNNING: CPU调度到该线程的时候。一旦CPU放弃调度后或yield后,该线程成RUNNABLE
    BLOCK: ,阻塞的IO操作,获取锁的时候加入到锁的阻塞队列,
    WAITTING:sleep, wait后加入waitSet,join,selector的wakeup
    TERMINALTED: 线程终止。

    线程池中提交任务

    threadPoolExecutor.execute(runnable);
    

    threadPoolExecutor#execute(runnable)

    可以看到当线程数少于核心数,core=true,表示需要新建线程。
    

    在这里插入图片描述

    addWorker(firstTask)

    在这里插入图片描述

    线程状态new: newWorker(command)->getThreadFactory().newThread(this)

    在这里插入图片描述

    线程状态runnable:worker.thread.start()

    回到addWorker的过程中,注意这里t.start()启动了 worker中的线程。
    在这里插入图片描述

    线程状态running:worker.thread.start()->run()->runWorker();

    Worker是Runnable的实现类, 内部含有Thread
    执行Worker实现的run()->runWorker(this)方法。
    当执行完**runWorker(this)**方法,线程也就自动走向了死亡。
    在这里插入图片描述

    runWorker(this)

    addWorker()#start()->runwWorker(this)

    可见,线程在循环中 一直从workQueue中取出threadPoolExecutor.execute(runnable)runnable
    task不为空,就task.run执行任务。
    当task为null则退出循环。然后结束该线程
    在这里插入图片描述

    getTask()

    线程启动期间 runWorker() ,循环getTask后run。
    当getTask为空,则退出循环,结束线程。
    因此,什么时候返回null是关键。
    下图可见,当线程池关闭(这里暂不细究),或者 获取任务超时都会导致返回null.
    在这里插入图片描述

    其他介绍

    ctl

    一个AtomicInteger,低28位用来表示线程数,高4位用来表示线程池状态。

    The main pool control state, ctl, is an atomic integer packing
    two conceptual fields
    workerCount, indicating the effective number of threads
    runState, indicating whether running, shutting down etc
    在这里插入图片描述

    线程池

    new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, timeUnit, workQueue,Executors.defaultThreadFactory(), defaultHandler);

    execute提交任务时:

    1. 当execute时,线程小于corePoolSize,则addWorker(firstTask,true)创建新线程。
    2. 当线程数量 大于核心数量corePoolSize后,则将任务入队。
    3. workQueue到达最大数量时,继续创建线程直到线程数量大于maximumPoolSize
    4. 当线程数量大于maximumPoolSize后,执行拒绝策略defaultHandler
    5. TERMINALTED:当非core线程空闲时间(getTask)超过keepAliveTime, timeUnit指定的时间后,则退出。
    6. threadPoolExecutor允许核心线程退出,类似于5.
  • 相关阅读:
    UML第一次编程作业
    css文本属性
    css文字属性
    Qobject设置对象名称和属性
    m3u8
    easyUI tree jQuery
    easyUI layout
    正则表达式
    Spring mvc 数据验证框架注解
    blur和click事件的先后顺序问题
  • 原文地址:https://www.cnblogs.com/thewindkee/p/12873102.html
Copyright © 2011-2022 走看看