ThreadpoolExecutor使用详解

一、ThreadPoolExecutor的定义和构造

ThreadPoolExecutor是线程池的一个实现类,它可以通过管理线程池中的线程来提高程序的性能和效率。下面介绍ThreadPoolExecutor的构造方法和参数:

public ThreadPoolExecutor(int corePoolSize,   //线程池中核心线程数
                          int maximumPoolSize,   //线程池最大线程数
                          long keepAliveTime,   //超出核心线程数的空闲线程存活时间
                          TimeUnit unit,   //存活时间的单位
                          BlockingQueue workQueue,    //保存任务的阻塞队列
                          ThreadFactory threadFactory,   //线程工厂
                          RejectedExecutionHandler handler   //拒绝策略
                          ) 

1、corePoolSize:线程池中维护的线程数量,即核心线程数,当线程池处于运行状态时,即使线程处于空闲状态也不会被回收;

2、maximumPoolSize:线程池中允许的最大线程数量;

3、keepAliveTime:当线程池中线程数量大于corePoolSize时,超出的空闲线程在被终止之前需要继续维护的时间;

4、unit:keepAliveTime的时间单位;

5、workQueue:阻塞队列,用于保存等待执行的任务;

6、threadFactory:线程工厂,用于创建新的线程;

7、handler:拒绝策略,用于处理当线程池已满时如何拒绝新任务的策略。

二、线程池中的线程池状态

线程池状态主要包括RUNNING、SHUTDOWN、STOP、TIDYING和TERMINATED。下面介绍这些状态的含义:

1、RUNNING:正在运行中,即线程池尚未关闭,并且其中的线程正在处理任务;
2、SHUTDOWN:线程池正在关闭中,不接受新的任务提交,但是队列中的任务会继续执行完;
3、STOP:线程池终止,不再接受新的任务,且正在处理的任务全部被中断并移出工作队列;
4、TIDYING:线程池处于SHUTDOWN状态时,所有的任务都已经执行完毕,线程池正在进行关闭操作;
5、TERMINATED:线程池已经完全终止。

三、阻塞队列的选择

ThreadPoolExecutor使用阻塞队列来保存等待执行的任务。下面介绍几种常见的阻塞队列:

1、ArrayBlockingQueue :一个基于数组结构的有界阻塞队列,按照先进先出原则对元素进行排序;

2、LinkedBlockingQueue :一个基于链表结构的有界阻塞队列,按照先进先出原则对元素进行排序,如果没有指定容量,则为Integer.MAX_VALUE;

3、SynchronousQueue :一个不存储元素的阻塞队列,在这个队列中每个插入操作必须等待另一个线程的移除操作,否则插入操作一直处于阻塞状态;

4、PriorityBlockingQueue:带有优先级的无界阻塞队列,按照先进先出原则排序,同时可以按照指定的Comparator插入元素,优先级高的元素会被先移除;

5、DelayQueue:是一个带有延时功能的无界阻塞队列,元素必须先定义延时时间,只有延时时间到期后才能被取出,适用于定时任务。

四、线程池的拒绝策略

线程池中当任务数超过最大线程数且阻塞队列已满时,会触发拒绝策略。下面介绍几种常见的拒绝策略:

1、AbortPolicy:抛出RejectedExecutionException,即不作处理;

2、CallerRunsPolicy:由提交任务的线程执行该任务;
3、DiscardOldestPolicy:将等待时间最长的任务从队列中删除,然后执行新的任务;
4、DiscardPolicy:不处理,静默丢弃。

五、ThreadPoolExecutor的使用示例

import java.util.concurrent.*;

public class ThreadPoolDemo {
    public static void main(String[] args) {
        //核心线程数为3,最大线程数为5,超过corePoolSize的线程数进入阻塞队列,阻塞队列大小为10,超过则使用拒绝策略。
        ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 5, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(10), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
        for (int i = 0; i < 20; i++) {
            executor.execute(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + " is running");
                }
            });
        }
        executor.shutdown();
    }
}

六、线程池的关闭

1、executor.shutdown():关闭线程池,会先停止接受新的任务,在等待所有任务执行完毕后关闭线程池;

2、executor.shutdownNow():立即关闭线程池,会尝试停止所有正在执行的任务,并返回未执行的任务;

3、executor.awaitTermination(long timeout, TimeUnit unit):等待线程池终止的时间,或者等待超时时间的过程中被中断。

七、总结

ThreadPoolExecutor事实上是Thread Pool模式的Java语言实现,它为并发编程提供了灵活而高效的线程池实现,适用于多种多样的场景。在实际应用中,我们可以根据应用场景来选择合适的的Thread Pool实例对象,以提高程序的性能和效率。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/312834.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2025-01-06 15:17
下一篇 2025-01-06 15:17

相关推荐

  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25
  • git config user.name的详解

    一、为什么要使用git config user.name? git是一个非常流行的分布式版本控制系统,很多程序员都会用到它。在使用git commit提交代码时,需要记录commi…

    编程 2025-04-25
  • Java BigDecimal 精度详解

    一、基础概念 Java BigDecimal 是一个用于高精度计算的类。普通的 double 或 float 类型只能精确表示有限的数字,而对于需要高精度计算的场景,BigDeci…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25
  • 详解eclipse设置

    一、安装与基础设置 1、下载eclipse并进行安装。 2、打开eclipse,选择对应的工作空间路径。 File -> Switch Workspace -> [选择…

    编程 2025-04-25
  • C语言贪吃蛇详解

    一、数据结构和算法 C语言贪吃蛇主要运用了以下数据结构和算法: 1. 链表 typedef struct body { int x; int y; struct body *nex…

    编程 2025-04-25
  • Python安装OS库详解

    一、OS简介 OS库是Python标准库的一部分,它提供了跨平台的操作系统功能,使得Python可以进行文件操作、进程管理、环境变量读取等系统级操作。 OS库中包含了大量的文件和目…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25

发表回复

登录后才能评论