浅谈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内部类示例详解及练习”的完整攻略。 什么是Java内部类 Java内部类(Inner Class)指的是定义在另一个类中的类。Java内部类可以分为四种类型:成员内部类、静态内部类、局部内部类、匿名内部类。其中,成员内部类是最常用的一种形式。 成员内部类示例 下面通过一个示例来详解一下成员内部类的定义和使用: public c…

    Java 2023年5月23日
    00
  • 详解IDEA搭建springBoot方式一(推荐)

    下面是详细讲解 “详解IDEA搭建springBoot方式一(推荐)” 的完整攻略: 一、前置准备 安装JDK和IntelliJ IDEA。 确认本地已经安装了maven,并且配置了maven环境变量。 二、创建Spring Boot项目 打开IntelliJ IDEA,选择Create New Project。 在左侧的“Spring Initializr…

    Java 2023年5月15日
    00
  • 如何将tomcat源码以maven方式运行

    下面是将Tomcat源码以Maven方式运行的详细攻略,包含以下步骤: 步骤一:准备工作 下载并安装 Apache Maven。 下载 Tomcat 源码。 安装 Java SE Development Kit (JDK)。 步骤二:编译 Tomcat 源码 打开终端或命令行窗口,并切换到 Tomcat 源码目录。 运行以下 Maven 命令编译 Tomca…

    Java 2023年5月19日
    00
  • Java解决代码重复的三个绝招分享

    下面是详细讲解“Java解决代码重复的三个绝招分享”的完整攻略。 一、引言 在Java编程中,我们经常遇到相似但又稍有不同的代码块,这时候如果直接复制粘贴,就会导致代码冗余和可维护性下降。而Java编程的目标之一就是要写出清晰且易于维护的代码。那么我们该如何有效地解决重复代码呢? 二、使用继承 重复的代码通常是由于相似的功能需求带来的。通过分析这些功能需求,…

    Java 2023年5月30日
    00
  • 浅谈Java实现回溯算法之八皇后问题

    浅谈Java实现回溯算法之八皇后问题 什么是八皇后问题? 八皇后问题是一个经典的问题,在一个8×8的棋盘上放置8个皇后,使得任意两个皇后都不能在同一行、同一列或同一对角线上。也就是说,每个皇后所在的行、列、对角线都必须存在且只能存在一个皇后。 回溯算法 回溯算法是一种有组织地遍历所有可能的情况的搜索算法。它从一条路径开始,尝试不同的选择,直到找到符合条件的解…

    Java 2023年5月19日
    00
  • Java反射之通过反射获取一个对象的方法信息(实例代码)

    使用Java反射可以在运行时获取一个类的各种信息,包括类的属性、方法、构造器等。本文将介绍如何通过反射获取一个对象的方法信息,并提供两个示例进行说明。 获取对象的方法信息 要获取一个对象的方法信息,需要使用Java反射中的Method类。Method类提供了关于类或接口中单独某个方法的信息和访问权限。 使用反射获取对象的方法信息的步骤如下: 获取该类的Cla…

    Java 2023年5月26日
    00
  • Spring异常捕获且回滚事务解决方案

    当在 Spring 中出现异常时,很关键的一点是如何捕获和处理异常以及如何实现事务的回滚。这篇文章将为您详细介绍 Spring 中异常捕获和事务回滚的解决方案。 异常处理 当 Spring 中的方法出现异常时,可以使用 try-catch 块来捕获异常,并在 catch 块中处理异常。Spring 还提供了 AOP(面向切面编程)的方式,使得我们可以单独将异…

    Java 2023年5月27日
    00
  • Java Calendar日历类的使用介绍

    当我们需要对日期进行计算时,Java中的Calendar类就变得很有用了。本文将介绍如何使用Calendar类进行日期的相关操作。 什么是Calendar类 Calendar是Java日期时间的中心类。它提供了查询日期、时间、周等日历字段(如YEAR、MONTH、DAY_OF_MONTH、HOUR)以及将时间转换为指定格式的方法。底层实现是Gregorian…

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