博客
关于我
线程池源码解析 5.shutdownNow() & tryTerminate() 方法
阅读量:796 次
发布时间:2023-03-25

本文共 987 字,大约阅读时间需要 3 分钟。

线程池源码解析—shutdown/Now() & tryTerminate() 方法

shutdown()

shutdown 方法用于将线程池状态设置为 SHUTDOWN,并中断所有空闲线程,最终设置为 TERMINATED 状态。该方法不会阻塞当前线程的执行。

实现步骤:

  • 获取全局锁 mainLock,确保线程安全。
  • 检查是否有权限执行 shutdown。
  • 将线程池状态设置为 SHUTDOWN。
  • 中断所有空闲的线程。
  • 调用 onShutdown 钩子方法,供子类扩展。
  • 最终调用 tryTerminate() 进行线程池关闭。
  • advanceRunState()

    该方法用于改变线程池状态。通过自旋和 CAS 操作,确保状态转换的原子性和一致性。

    实现细节:

  • 使用自旋循环,确保状态转换尽可能快。
  • 使用 CAS 操作,避免锁竞争,提升性能。
  • interruptIdleWorkers()

    该方法用于中断线程池中的空闲线程。具体实现如下:

  • 获取全局锁 mainLock。
  • 遍历所有 worker。
  • 对于处于空闲状态的线程,发送中断信号。
  • 中断仅限于一个线程后立即停止。
  • shutdownNow()

    shutdownNow 方法与 shutdown 有以下区别:

  • 设置线程池状态为 STOP。
  • 将队列中的任务导出。
  • 中断所有线程。
  • 调用 tryTerminate() 进行最终关闭。
  • 实现细节:

  • 获取全局锁 mainLock。
  • 检查权限。
  • 设置线程池状态为 STOP。
  • 中断所有线程。
  • 将任务导出到列表中。
  • 调用 tryTerminate()。
  • tryTerminate()

    该方法用于判断线程池是否需要终止。

    实现细节:

  • 检查线程池状态:
    • 如果处于 RUNNING 状态,直接返回。
    • 如果处于 TIDYING 或更高状态,返回。
    • 如果处于 SHUTDOWN 并且队列不为空,返回。
  • 如果线程池处于 STOP 或 SHUTDOWN 且队列为空,且 workerCount 不为 0:
    • 中断一个空闲线程。
    • 返回。
  • 最后一个退出的线程会设置线程池状态为 TIDYING 并唤醒等待的线程。
  • 唤醒所有线程后,线程池最终设置为 TERMINATED。
  • 通过上述分析,可以清晰地理解线程池 shutdown 和 shutdownNow 方法的实现原理,以及如何确保线程池的安全关闭。

    转载地址:http://ezhfk.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现图像移动(附完整源码)
    查看>>
    Objective-C实现图层混合算法(附完整源码)
    查看>>
    Objective-C实现图片erosion operation侵蚀操作算法(附完整源码)
    查看>>
    Objective-C实现图片的放大缩小(附完整源码)
    查看>>
    Objective-C实现图片腐蚀(附完整源码)
    查看>>
    Objective-C实现图片膨胀(附完整源码)
    查看>>
    Objective-C实现图的邻接矩阵(附完整源码)
    查看>>
    Objective-C实现圆球的表面积和体积(附完整源码)
    查看>>
    Objective-C实现在Regex的帮助下检查字谜算法(附完整源码)
    查看>>
    Objective-C实现均值滤波(附完整源码)
    查看>>
    Objective-C实现埃拉托斯特尼筛法算法(附完整源码)
    查看>>
    Objective-C实现域名解析(附完整源码)
    查看>>
    Objective-C实现域名转IP(附完整源码)
    查看>>
    Objective-C实现培根密码算法(附完整源码)
    查看>>
    Objective-C实现基于 LIFO的堆栈算法(附完整源码)
    查看>>
    Objective-C实现基于 LinkedList 的添加两个数字的解决方案算法(附完整源码)
    查看>>
    Objective-C实现基于opencv的抖动算法(附完整源码)
    查看>>
    Objective-C实现基于事件对象实现线程同步(附完整源码)
    查看>>
    Objective-C实现基于信号实现线程同步(附完整源码)
    查看>>
    Objective-C实现基于文件流拷贝文件(附完整源码)
    查看>>