博客
关于我
Java线程池源码及原理
阅读量:445 次
发布时间:2019-03-06

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

线程池的状态与源码分析

1. 线程池的状态

线程池的运行状态通过 ctl 中的高3位来表示,共有5种状态:

  • RUNNING:高3位为111,线程池接收新任务。
  • SHUTDOWN:高3位为000,线程池停止接收新任务。
  • STOP:高3位为001,线程池完全终止。
  • TIDYING:高3位为010,所有任务已终止。
  • TERMINATED:高3位为011,terminated() 方法已执行完成。

线程池的核心池大小为 corePoolSize,最大允许线程数为 maximumPoolSize,线程活跃时间为 keepAliveTime


2. 任务的执行

线程池的任务执行流程分为几个关键步骤:

  • execute(Runnable command)

    • 检查当前运行线程数是否小于核心池大小 corePoolSize,如果是,则直接调用 addWorker
    • 否则,将任务添加到工作队列 workQueue 中。
    • 如果工作队列已满,则尝试再次调用 addWorker
  • addWorker(Runnable firstTask, boolean core)

    • 判断线程池状态。
    • 通过 CAS 操作增加运行线程数。
    • 创建 Worker 实例,线程通过 ThreadFactory 构造,并将 Workerrun() 方法设置为线程的初始目标。
    • 启动线程。
  • runWorker(Worker w)

    • 循环调用 getTask() 获取任务。
    • 执行任务前调用 beforeExecute 方法。
    • 执行任务后调用 afterExecute 方法。
  • getTask()

    • 通过 ctl.get() 获取当前线程池状态 c
    • 根据 runStateOf(c) 判断线程池状态:
      • 如果是 SHUTDOWNSTOP 且工作队列为空,减少运行线程数并返回 null
    • 获取当前运行线程数 wc
    • 如果是核心线程允许超时或线程数量超过最大值且工作队列为空,尝试减少运行线程数并返回 null
    • 从工作队列中获取任务。如果任务存在,返回任务;否则,等待队列中的任务。

  • 3. 任务执行,带返回值的

    线程池支持带返回值的任务执行,主要通过 Future 实现。具体方法如下:

    public Future
    submit(Callable
    task) { if (task == null) throw new NullPointerException(); RunnableFuture
    ftask = newTaskFor(task); execute(ftask); return ftask;}public Future
    submit(Runnable task) { if (task == null) throw new NullPointerException(); RunnableFuture
    ftask = newTaskFor(task, null); execute(ftask); return ftask;}
    • 将任务封装到 RunnableFuture 中,并通过 execute 方法提交执行。
    • RunnableFuture 实现了 Future 接口,可以用来获取任务的执行结果。

    参考资料

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

    你可能感兴趣的文章
    Open-Sora代码详细解读(2):时空3D VAE
    查看>>
    Open-Source Service Discovery
    查看>>
    open-vm-tools-dkms : 依赖: open-vm-tools (>= 2:9.4.0-1280544-5ubuntu3) 但是它将不会被安装
    查看>>
    open3d-Dll缺失,未找到指定模块解决
    查看>>
    openai Midjourney代理服务 gpt大模型第三方api平台汇总 支持国内外各种大模型 持续更新中...
    查看>>
    OpenAll:Android打开组件新姿势【仅供用于学习了解ButterKnife框架基本原理】
    查看>>
    OpenASR 项目使用教程
    查看>>
    Openbox-桌面图标设置
    查看>>
    opencart出现no such file or dictionary
    查看>>
    OpenCV 3.1 imwrite()函数写入异常问题解决方法
    查看>>
    OpenCV 4.1.0版drawContours
    查看>>
    Opencv cv2.putText 函数详解
    查看>>
    opencv glob 内存溢出异常
    查看>>
    opencv Hog Demo
    查看>>
    opencv Hog学习总结
    查看>>
    opencv Mat push_back
    查看>>
    opencv putText中文乱码
    查看>>
    OpenCV Python围绕特定点将图像旋转X度
    查看>>
    opencv resize
    查看>>
    Opencv Sift和Surf特征实现图像无缝拼接生成全景图像
    查看>>