并发编程系列——6线程池核心原理分析

本文探讨了线程池的概念、作用以及Java中常见的线程池类型,如newFixedThreadPool、newSingleThreadExecutor等。同时,文章深入分析了线程池的初始化、execute方法、worker运行机制等核心原理,帮助理解线程池的工作流程和资源管理。
摘要由CSDN通过智能技术生成

学习目标

  1. 线程池的作用

  2. jdk给我们提供了哪几种常用线程池

  3. 线程池有哪几大核心参数

  4. 线程池的拒绝策略有哪些

  5. 线程中阻塞队列的作用

  6. 线程池的工作流程

  7. 线程池的设计思维

  8. 线程池中的阻塞队列如果用默认的,会有哪些问题

  9. 线程池的工作状态有哪些

  10. 线程池中核心线程数量大小怎么设置?

第1章 线程池简介

1.1 线程的问题

  1. 线程执行完run发放自动被销毁了,且任务与线程绑定在了一起,所以当任务多的时候,会频繁的创建和销毁线程,这给我们CPU和内存带来了很大的开销。

  2. 线程一多了,无法实现统一管理。

1.2 线程池的概念及作用

  1. 他是池化技术的一种应用

  2. 他实现了线程的重复利用

  3. 实现了对线程资源的管理控制

1.3 常见线程池

  1. newFixedThreadPool:该方法返回一个固定数量的线程池,线程数不变,当有一个任务提交时,若线程池中空闲,则立即执行,若没有,则会被暂缓在一个任务队列中,等待有空闲的线程去执行。

  2. newSingleThreadExecutor: 创建一个线程的线程池,若空闲则执行,若没有空闲线程则暂缓在任务队列中。

  3. newCachedThreadPool:返回一个可根据实际情况调整线程个数的线程池,不限制最大线程数量,若用空闲的线程则执行任务,若无任务则不创建线程。并且每一个空闲线程会在60秒后自动回收

  4. newScheduledThreadPool: 创建一个可以指定线程的数量的线程池,但是这个线程池还带有延迟和周期性执行任务的功能,类似定时器。

  5. newWorkStealingPool:适合使用在很耗时的操作,但是newWorkStealingPool不是ThreadPoolExecutor的扩展,它是新的线程池类ForkJoinPool的扩展,但是都是在统一的一个Executors类中实现,由于能够合理的使用CPU进行对任务操作(并行操作),所以适合使用在很耗时的任务中

第2章 线程池原理分析

2.1 初始化

我们先看下初始化5个参数

public ThreadPoolExecutor(int corePoolSize,  
                          int maximumPoolSize,    
                          long keepAliveTime,
                          TimeUnit unit, 
                          BlockingQueue<Runnable> workQueue) {  
    this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
         Executors.defaultThreadFactory(), defaultHandler);
}

    public ThreadPoolExecutor(int corePoolSize,  //主线程数
                              int maximumPoolSize,  //最大线程数
                              long keepAliveTime,    //线程存活时间   (除主线程外,其他的线程在没有任务执行的时候需要回收,多久后回收)
                              TimeUnit unit,  //存活时间的时间单位
                              BlockingQueue<Runnable> workQueue,  //阻塞队列,我们需要执行的task都在该队列
                              ThreadFactory threadFactory,  //生成thread的工厂
                              RejectedExecutionHandler handler) {  //拒绝饱和策略,当队列满了并且线程个数达到 maximunPoolSize 后采取的策略
        if (corePoolSize < 0 ||
            maximumPoolSize <= 0 ||
            maximumPoolSize < corePoolSize ||
            keepAliveTime < 0)
            throw new IllegalArgumentException();
        if (workQueue == null || threadFactory == null || handler == null)
            throw new NullPointerException();
        this.acc = System.getSecurityManager() == null ?
                null :
                AccessController.getContext();
        this.corePoolSize = corePoolSize;
        this.maximumPoolSize = maximumPoolSize;
        this.workQueue = workQueue;
        this.keepAliveTime = unit
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木木_2024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值