温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java线程池ThreadPoolExecutor怎么创建

发布时间:2022-06-13 11:34:41 来源:亿速云 阅读:393 作者:zzz 栏目:开发技术

Java线程池ThreadPoolExecutor怎么创建

在Java中,线程池是一种用于管理多个线程的机制,它可以有效地控制线程的创建、执行和销毁,从而提高程序的性能和资源利用率。ThreadPoolExecutor 是 Java 提供的一个强大的线程池实现类,它允许开发者自定义线程池的核心参数,如核心线程数、最大线程数、线程存活时间、任务队列等。

本文将详细介绍如何使用 ThreadPoolExecutor 创建线程池,并解释各个参数的含义。

1. ThreadPoolExecutor 的基本概念

ThreadPoolExecutorjava.util.concurrent 包中的一个类,它实现了 ExecutorService 接口。通过 ThreadPoolExecutor,开发者可以创建一个线程池,并将任务提交给线程池执行。

1.1 核心参数

ThreadPoolExecutor 的构造函数有多个参数,以下是其中最重要的几个:

  • corePoolSize: 核心线程数,即线程池中保持活动状态的线程数量。
  • maximumPoolSize: 最大线程数,即线程池中允许的最大线程数量。
  • keepAliveTime: 线程空闲时间,当线程池中的线程数量超过核心线程数时,多余的空闲线程在终止前等待新任务的最长时间。
  • unit: 空闲时间的单位,通常为 TimeUnit.SECONDSTimeUnit.MILLISECONDS
  • workQueue: 任务队列,用于保存等待执行的任务。
  • threadFactory: 线程工厂,用于创建新线程。
  • handler: 拒绝策略,当任务无法被线程池接受时,如何处理这些任务。

1.2 任务队列

任务队列是线程池中用于存储等待执行的任务的容器。常见的任务队列类型包括:

  • SynchronousQueue: 一个不存储元素的阻塞队列,每个插入操作必须等待另一个线程的移除操作。
  • LinkedBlockingQueue: 一个基于链表结构的阻塞队列,可以设置容量上限。
  • ArrayBlockingQueue: 一个基于数组结构的有界阻塞队列。

1.3 拒绝策略

当线程池中的线程数量达到最大值,并且任务队列已满时,新提交的任务将被拒绝。ThreadPoolExecutor 提供了几种内置的拒绝策略:

  • AbortPolicy: 直接抛出 RejectedExecutionException 异常。
  • CallerRunsPolicy: 由提交任务的线程直接执行该任务。
  • DiscardPolicy: 直接丢弃任务,不抛出异常。
  • DiscardOldestPolicy: 丢弃队列中最旧的任务,然后重新尝试提交当前任务。

2. 创建 ThreadPoolExecutor

下面是一个创建 ThreadPoolExecutor 的示例代码:

import java.util.concurrent.*;

public class ThreadPoolExecutorExample {
    public static void main(String[] args) {
        // 核心线程数
        int corePoolSize = 2;
        // 最大线程数
        int maximumPoolSize = 4;
        // 线程空闲时间
        long keepAliveTime = 10;
        // 空闲时间单位
        TimeUnit unit = TimeUnit.SECONDS;
        // 任务队列
        BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(10);
        // 线程工厂
        ThreadFactory threadFactory = Executors.defaultThreadFactory();
        // 拒绝策略
        RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();

        // 创建线程池
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
                corePoolSize,
                maximumPoolSize,
                keepAliveTime,
                unit,
                workQueue,
                threadFactory,
                handler
        );

        // 提交任务
        for (int i = 0; i < 10; i++) {
            executor.execute(() -> {
                System.out.println("Task executed by " + Thread.currentThread().getName());
            });
        }

        // 关闭线程池
        executor.shutdown();
    }
}

2.1 代码解析

  • corePoolSize: 设置为 2,表示线程池中始终保持 2 个活动线程。
  • maximumPoolSize: 设置为 4,表示线程池中最多允许 4 个线程同时运行。
  • keepAliveTime: 设置为 10 秒,表示当线程池中的线程数量超过核心线程数时,多余的空闲线程在终止前等待新任务的最长时间为 10 秒。
  • unit: 设置为 TimeUnit.SECONDS,表示空闲时间的单位为秒。
  • workQueue: 使用 LinkedBlockingQueue,并设置容量为 10,表示任务队列最多可以存储 10 个任务。
  • threadFactory: 使用默认的线程工厂 Executors.defaultThreadFactory()
  • handler: 使用 AbortPolicy,表示当任务无法被线程池接受时,直接抛出 RejectedExecutionException 异常。

2.2 任务提交与执行

在示例代码中,我们通过 executor.execute() 方法提交了 10 个任务。由于核心线程数为 2,最大线程数为 4,任务队列容量为 10,因此前 2 个任务会立即由核心线程执行,接下来的 2 个任务会创建新的线程执行,剩下的 6 个任务会被放入任务队列中等待执行。

2.3 关闭线程池

在任务提交完成后,我们调用 executor.shutdown() 方法关闭线程池。该方法会等待所有已提交的任务执行完毕后,再关闭线程池。

3. 总结

ThreadPoolExecutor 是 Java 中一个非常强大的线程池实现类,通过合理配置核心线程数、最大线程数、任务队列和拒绝策略,可以有效地管理线程资源,提高程序的性能和稳定性。在实际开发中,建议根据具体的业务需求选择合适的参数配置,以达到最佳的性能效果。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI