温馨提示×

java newfixedthreadpool如何配置

小樊
84
2024-11-26 14:55:25
栏目: 编程语言

newFixedThreadPool 是 Java 中 ExecutorService 接口的一个实现,它创建了一个固定大小的线程池。要配置 newFixedThreadPool,你需要设置以下参数:

  1. 核心线程数(corePoolSize):这是线程池中始终保持活跃的线程数量。即使这些线程处于空闲状态,也不会被终止。如果任务数量超过了核心线程数,那么将会创建新的工作线程来处理任务。

  2. 最大线程数(maximumPoolSize):这是线程池中允许的最大线程数量。当任务数量超过了核心线程数,并且所有核心线程都在忙碌时,线程池会创建新的工作线程,直到达到最大线程数。

  3. 任务队列(workQueue):这是一个用于存储等待执行的任务的队列。当线程池中的线程完成任务后,新提交的任务会被添加到任务队列中。如果任务队列已满,且线程池中的线程都在忙碌,那么线程池会根据拒绝策略(RejectedExecutionHandler)处理无法执行的任务。

  4. 线程工厂(ThreadFactory):这是一个用于创建新线程的工厂。你可以使用自定义的线程工厂来设置线程的名称、优先级等属性。

  5. 拒绝策略(RejectedExecutionHandler):当任务队列已满,且线程池中的线程都在忙碌时,线程池会根据拒绝策略处理无法执行的任务。Java 提供了四种内置的拒绝策略:

    • AbortPolicy(默认策略):直接抛出 RejectedExecutionException 异常。
    • CallerRunsPolicy:在调用者线程中执行被拒绝的任务。
    • DiscardPolicy:直接丢弃被拒绝的任务,不抛出异常。
    • DiscardOldestPolicy:丢弃队列中最旧的任务,然后尝试重新提交被拒绝的任务。

下面是一个使用 newFixedThreadPool 的示例:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class FixedThreadPoolExample {
    public static void main(String[] args) {
        int corePoolSize = 5;
        int maximumPoolSize = 10;
        long keepAliveTime = 60L;
        TimeUnit unit = TimeUnit.SECONDS;
        BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(20);
        ThreadFactory threadFactory = Executors.defaultThreadFactory();
        RejectedExecutionHandler rejectedExecutionHandler = new ThreadPoolExecutor.CallerRunsPolicy();

        ExecutorService executorService = Executors.newFixedThreadPool(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, rejectedExecutionHandler);

        // 提交任务到线程池
        for (int i = 0; i < 30; i++) {
            executorService.submit(() -> {
                System.out.println("Task executed by thread: " + Thread.currentThread().getName());
            });
        }

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

在这个示例中,我们创建了一个固定大小为 5 的线程池,最大线程数为 10,空闲线程在 60 秒后会被终止。任务队列的容量为 20,使用默认的线程工厂和调用者运行策略作为拒绝策略。

0