浅谈Java ThreadPoolExecutor的使用

yizhihongxing

浅谈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 JDK 1.8及以上 Apache Maven Eclipse或其他Java开发IDE 项目创建 在IDE中创建一个Maven项目,选择纯Java项目,并添…

    Java 2023年6月16日
    00
  • Java举例讲解分治算法思想

    Java举例讲解分治算法思想 分治算法概述 在计算机科学中,分治算法是一种很重要的算法思想,它的基本思想是将问题划分成若干规模较小但结构相似的子问题,然后分别解决这些子问题,最后通过合并这些子问题的解得到原问题的解。分治算法的步骤分为三步:1. 分解原问题2. 求解子问题3. 合并子问题的解得到原问题的解 示例一 我们来看一个求一组数据里的最大值的分治算法。…

    Java 2023年5月19日
    00
  • Bootstrap和Java分页实例第一篇

    首先,该攻略主要针对的是Bootstrap和Java分页实例的基础入门教程,对于前端和Java开发初学者非常实用。文本将分为以下几个部分进行讲解: 一、Bootstrap的基础使用 1.1 引入Bootstrap到项目中 在使用Bootstrap进行开发时,首先需要在项目中引入Bootstrap的CSS和JS文件,这可以通过CDN链接或者下载本地文件的方式引…

    Java 2023年6月15日
    00
  • SpringBoot数据层处理方案精讲

    Spring Boot是一个流行的Java框架,可以帮助开发人员更加高效地构建和部署应用程序。在Spring Boot中,数据层处理是非常重要的一部分,它可以帮助我们管理和操作数据。在本文中,我们将详细讲解Spring Boot数据层处理方案的精髓。 数据层处理方案 在Spring Boot中,数据层处理方案通常包括以下几个方面: 数据库访问:Spring …

    Java 2023年5月15日
    00
  • 详解Java中雪花算法的实现

    详解Java中雪花算法的实现 需求概述 在分布式系统中,为了保证业务数据的唯一性,需要生成唯一的ID。传统的ID生成方式可能出现因为高并发而重复的情况,而雪花算法(Snowflake)正是为了解决这个问题而出现的。 本文会详细介绍Java中雪花算法的实现,及其原理。 雪花算法的基本原理 雪花算法是Twitter开源的分布式ID生成算法,采用一个64位的lon…

    Java 2023年5月19日
    00
  • java中的tostring方法的具体用法

    下面是关于Java中toString方法的详细解释: 什么是toString方法? 在Java中,toString方法是一个对象的一个内置方法,它可以将对象转换为字符串表示形式。默认情况下,该方法返回的字符串包含该对象的类名和hash code值。这时我们通常需要自定义该方法,以便输出我们所需要的信息。 如何重写toString方法? 要重写toString…

    Java 2023年5月26日
    00
  • JSP 开发之Spring Boot 动态创建Bean

    针对“JSP 开发之Spring Boot 动态创建Bean”,我会提供下面的完整攻略。 一、简介 在Spring Boot开发中,我们可以通过定义Java类来定义Bean,但有些场景下我们需要在程序运行时动态创建Bean,这就需要使用Spring Boot的动态Bean创建特性。 二、动态创建Bean 下面是Spring Boot创建Bean的示例代码: …

    Java 2023年6月15日
    00
  • Windows7下的Java运行环境搭建过程图解

    Windows7下的Java运行环境搭建过程图解 简介 Java 开发环境包含了 JDK 和 JRE 两部分。JDK 是 Java Development Kit 的缩写,包含了 Java SE 开发工具和 JRE(Java Runtime Environment)。JRE 是 Java 运行环境,是运行 Java 代码所必须的。为了在 Windows7 下…

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