浅谈Java ThreadPoolExecutor的使用

浅谈Java ThreadPoolExecutor的使用

什么是ThreadPoolExecutor

ThreadPoolExecutor是Java中的线程池的实现类之一,通过它可以实现线程池的管理和任务分配的功能,是多线程程序开发中常用的工具。

ThreadPoolExecutor的构造方法

ThreadPoolExecutor有多个构造方法,常用的有以下四种:

  1. ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue workQueue):构造一个新的ThreadPoolExecutor,将使用给定的初始参数和阻塞队列。

  2. ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue workQueue,ThreadFactory threadFactory): 构造一个新的ThreadPoolExecutor,将使用给定的初始参数,阻塞队列和线程工厂

  3. ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue workQueue,RejectedExecutionHandler handler):构造一个新的ThreadPoolExecutor,将使用给定的初始参数,阻塞队列和饱和策略。

  4. ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler): 构造一个新的ThreadPoolExecutor,将使用给定的初始参数,阻塞队列,线程工厂和饱和策略。

常用参数

  • corePoolSize:线程池核心线程数,当任务数量达到核心线程数时,线程池会创建新的线程来执行任务,但是创建的线程数不能超过maximumPoolSize
  • maximumPoolSize:线程池最大线程数,当任务数量达到最大线程数时,线程池会根据饱和策略来处理任务。
  • keepAliveTime:线程的空闲时间,当线程处于空闲状态超过指定时间,线程会被销毁。
  • unit:时间单位。
  • workQueue:阻塞队列,用于存储等待执行的任务。
  • threadFactory:创建线程的工厂。
  • handler:饱和策略,当任务数量大于 maximumPoolSize + workQueue 的容量时,线程池的处理策略。

示例

任务队列使用LinkedBlockingQueue

代码示例:

public class LinkedBlockingQueueDemo {
    public static void main(String[] args) {
        int corePoolSize = 2;
        int maximumPoolSize = 4;
        long keepAliveTime = 60;
        TimeUnit unit = TimeUnit.SECONDS;
        BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(10);
        RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();
        ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, handler);
        for (int i = 1; i <= 20; i++) {
            final int j = i;
            executor.execute(() -> {
                System.out.println("Task " + j + " is Running...");
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }
        executor.shutdown();
    }
}

执行结果:

Task 1 is Running...
Task 2 is Running...
Task 3 is Running...
Task 4 is Running...
Task 5 is Running...
Task 6 is Running...
Task 7 is Running...
Task 8 is Running...
Task 9 is Running...
Task 10 is Running...
Task 11 is Running...
Task 12 is Running...
Task 13 is Running...
Task 14 is Running...
Task 15 is Running...
Task 16 is Running...
Task 17 is Running...
Task 18 is Running...
Task 19 is Running...
Task 20 is Running...

任务队列使用ArrayBlockingQueue

代码示例:

public class ArrayBlockingQueueDemo {
    public static void main(String[] args) {
        int corePoolSize = 2;
        int maximumPoolSize = 4;
        long keepAliveTime = 60;
        TimeUnit unit = TimeUnit.SECONDS;
        BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(10);
        RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();
        ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, handler);
        for (int i = 1; i <= 20; i++) {
            final int j = i;
            executor.execute(() -> {
                System.out.println("Task " + j + " is Running...");
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }
        executor.shutdown();
    }
}

执行结果:

Task 1 is Running...
Task 2 is Running...
Task 3 is Running...
Task 4 is Running...
Task 5 is Running...
Task 6 is Running...
Task 7 is Running...
Task 8 is Running...
Task 9 is Running...
Task 10 is Running...

由于ArrayBlockingQueue的容量为10,而创建线程池规定的最大线程数为4,故只有前10个任务可以加入到队列中执行,后面的任务因为队列已满,无法加入队列,被拒绝执行。因此,只输出了前10个任务的执行结果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈Java ThreadPoolExecutor的使用 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • java实现文件拷贝的七种方式

    我来为你讲解“Java实现文件拷贝的七种方式”的攻略。以下是这七种方式: 1. 使用字节流(InputStream和OutputStream)进行拷贝 字节流是Java I/O中的基本类,可以方便地进行文件拷贝。我们可以使用 FileInputStream 读取源文件,将数据写入 FileOutputStream 中实现文件拷贝。具体代码如下: public…

    Java 2023年5月20日
    00
  • Maven项目分析剔除无用jar引用的方法步骤

    Maven是一款非常流行的项目管理工具,它可以帮助我们自动管理项目所需的jar包依赖。但是,当项目依赖的jar包过多时,会导致打包后的文件非常大,同时也会影响项目的运行效率。因此,我们需要对项目进行分析,剔除一些无用的jar包依赖。下面是Maven项目分析剔除无用jar引用的方法步骤的详细介绍: 1. 使用Maven插件dependency:analyze …

    Java 2023年5月19日
    00
  • Spring MVC框架配置方法详解

    以下是关于“Spring MVC框架配置方法详解”的完整攻略,其中包含两个示例。 Spring MVC框架配置方法详解 Spring MVC是一个基于MVC模式的Web框架,它可以帮助我们快速开发Web应用程序。本文将介绍Spring MVC的框架配置方法,并提供两个示例。 配置DispatcherServlet DispatcherServlet是Spri…

    Java 2023年5月16日
    00
  • java基础之数组常用操作总结(必看篇)

    Java基础之数组常用操作总结(必看篇) 一、什么是数组 数组是一种容器,用于存储固定大小的同类型元素序列。在Java中,数组是用连续的内存空间来存储相同类型的数据。 二、数组的定义 Java中使用[]来声明一个数组类型,且数组必须被初始化为一定数量的元素。数组的长度是不可变的。 dataType[] arrayName; // 声明数组 arrayName…

    Java 2023年5月26日
    00
  • java中JsonObject与JsonArray转换方法实例

    下面是对 “Java中JsonObject与JsonArray转换方法实例” 的详细讲解。 什么是JSONObject和JSONArray? JSONObject 和 JSONArray 是 JSON 格式的两种常用的 Java 类型。其中,JSONObject 是一个键值对的集合,类似于 Java 中的 Map,而 JSONArray 则是一组有序的值集合…

    Java 2023年5月26日
    00
  • 使用java的Calendar对象获得当前日期

    要使用Java的Calendar对象获得当前日期,有以下几个步骤: 1. 创建一个Calendar对象 需要导入java.util.Calendar类,创建Calendar对象,可以使用Calendar类中提供的静态方法getInstance()来获取当前时间的Calendar对象。 import java.util.Calendar; Calendar c…

    Java 2023年5月20日
    00
  • IDEA多线程文件下载插件开发的步骤详解

    下面我会为你详细讲解“IDEA多线程文件下载插件开发的步骤详解”的完整攻略。整个过程将包含以下几个步骤: 确定要实现的功能 新建一个IntelliJ IDEA插件项目 编写代码,完成下载文件的功能 安装和调试插件 将插件打包发布 下面对每个步骤进行详细说明: 1. 确定要实现的功能 在开发插件之前,我们需要确定插件要实现的功能和使用场景。本篇攻略实现的功能是…

    Java 2023年5月26日
    00
  • Java Spring Boot 集成Zookeeper

    Java Spring Boot 集成 Zookeeper 完整攻略 什么是 Zookeeper ZooKeeper 是一个分布式协调服务,能够在分布式系统中提供一致性,可靠性,易用性的功能,使得分布式应用的开发和维护变得更加容易。 ZooKeeper 作为独立的服务来运行,但常常与分布式应用程序一起使用,作为分布式应用程序的一部分运行。 集成 Zookee…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部