首页后端开发JAVA从入门到精通:Java线程池原理 3W 字长文全面指南

从入门到精通:Java线程池原理 3W 字长文全面指南

时间2023-12-07 09:43:02发布访客分类JAVA浏览446
导读:前言大家好,我是 Lorin。随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器。J.U.C提供的线程池:ThreadPoolExecutor类,帮助开发人员管理线程并...

前言

  • 大家好,我是 Lorin。随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器。J.U.C提供的线程池:ThreadPoolExecutor类,帮助开发人员管理线程并方便地执行并行任务。
  • 本文从线程池概念和用途开始介绍,然后接着结合线程池的源码,领略线程池的设计思路,最后结合实践介绍线程使用的一些常见案例以及线程池参数配置难题引出动态线程池。无论您是一个经验丰富的Java开发者,还是刚刚起步的新手,我相信您都将从本文中获得有价值的信息和见解。

线程池是什么

  • 线程池是一种并发编程的工具,它管理和复用线程,以便更有效地执行多个任务。线程池维护一组可用线程,任务到达时将其分配给这些线程,执行完成后线程可以被重新用于执行其他任务。线程池的主要目标是减少线程的创建和销毁开销,提高系统的性能和稳定性。

线程池解决的问题和带来的好处

降低资源消耗,提高响应速度

  • 通过池化技术重复利用已创建的线程,降低线程创建和销毁造成的损耗。
  • 任务到达时,无需等待线程创建即可立即执行,提高响应速度。

提高线程的可管理性,保证系统的稳定性

  • 线程是稀缺资源,如果无限制创建,不仅会消耗系统资源,还会因为线程的不合理分布导致资源调度失衡,降低系统的稳定性。使用线程池可以进行统一的分配、调优和监控。

提供更多更强大的功能

  • 线程池具备可拓展性,允许开发人员向其中增加更多的功能。比如定时线程池ScheduledThreadPoolExecutor,允许任务延期执行或定期执行。

核心设计与实现

  • 线程池是一种通过“池化”思想,帮助我们管理线程而获取并发性的工具,在Java中的体现是ThreadPoolExecutor类。下面我们来看一下它的核心设计与具体实现。
  • 源码JDK版本:1.8

ThreadPoolExecutor UML类图

  • ThreadPoolExecutor实现的顶层接口是Executor,顶层接口Executor提供了一种思想:将任务提交和任务执行进行解耦。用户无需关注如何创建线程,如何调度线程来执行任务,用户只需提供Runnable对象,将任务的运行逻辑提交到执行器(Executor)中,由Executor框架完成线程的调配和任务的执行部分。
  • ExecutorService接口增加了一些能力:(1)扩充执行任务的能力,补充可以为一个或一批异步任务生成Future的方法;(2)提供了管控线程池的方法,比如停止线程池的运行。
  • AbstractExecutorService则是上层的抽象类,将执行任务的流程串联了起来,保证下层的实现只需关注一个执行任务的方法即可。
  • 最下层的实现类ThreadPoolExecutor实现最复杂的运行部分,ThreadPoolExecutor将会一方面维护自身的生命周期,另一方面同时管理线程和任务,使两者良好的结合从而执行并行任务。

ThreadPoolExecutor 状态

  • 线程池的状态并不是由用户显示维护,而是伴随线程池运行由内部进行维护,线程池内部使用一个变量维护两个值:运行状态(runState)和线程数量 (workerCount)。
  • 在具体实现中,线程池将运行状态(runState)、线程数量 (workerCount)两个关键参数的维护放在了一起(使用原子操作保证读取和修改线程安全,而不使用额外的锁),如下代码所示:
    private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
    
    private static final int COUNT_BITS = Integer.SIZE - 3;
    
    private static final int CAPACITY   = (1  COUNT_BITS) - 1;
    

    // runState is stored in the high-order bits
    private static final int RUNNING    = -1  COUNT_BITS;
    
    private static final int SHUTDOWN   =  0  COUNT_BITS;
    
    private static final int STOP       =  1  COUNT_BITS;
    
    private static final int TIDYING    =  2  COUNT_BITS;
    
    private static final int TERMINATED =  3  COUNT_BITS;
    

运行状态

  • 从上面我们可以知道,线程池共有 5 种状态:

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: 从入门到精通:Java线程池原理 3W 字长文全面指南
本文地址: https://pptw.com/jishu/571786.html
Java之Reader:解析字符流,读取文件内容不再是难事! 通过 Java Service了解 PBKDF2 算法及在java中的使用

游客 回复需填写必要信息