ThreadPoolExecutor
Woody

Woody @woodyxin

About: all my ex living in taxes

Joined:
Apr 19, 2025

ThreadPoolExecutor

Publish Date: Jun 13
0 1

好的!下面我给你写一个关于线程池的详细教程,帮助你理解线程池的概念、作用,以及如何在Java中使用线程池。


线程池教程

1. 什么是线程池?

线程池(Thread Pool)是一个管理和复用多个线程的机制。它通过预先创建一定数量的线程,重复利用这些线程来执行任务,而不是每次都创建和销毁线程。

线程池的优势:

  • 性能提升:减少了频繁创建和销毁线程的开销。
  • 资源控制:限制同时运行的线程数量,避免资源耗尽。
  • 任务管理:方便管理和调度大量异步任务。

2. Java中线程池的基础

Java标准库中,线程池由java.util.concurrent包中的Executor框架支持,常用类:

  • Executor:执行任务的接口。
  • ExecutorService:Executor的子接口,支持线程池管理。
  • ThreadPoolExecutor:线程池的核心实现类。

Java 5引入了Executors工具类,简化线程池创建。


3. 创建线程池的几种方式

Java提供了几种常用的线程池类型,可以通过Executors工厂方法创建:

线程池类型 说明 代码示例
FixedThreadPool 固定大小的线程池,线程数量固定 Executors.newFixedThreadPool(5)
CachedThreadPool 缓存线程池,线程数量不固定,适合执行大量短生命周期任务 Executors.newCachedThreadPool()
SingleThreadExecutor 单线程池,只有一个线程串行执行任务 Executors.newSingleThreadExecutor()
ScheduledThreadPool 支持定时和周期性任务执行 Executors.newScheduledThreadPool(3)

4. 线程池使用示例

这里用FixedThreadPool演示:

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

public class ThreadPoolDemo {
    public static void main(String[] args) {
        // 创建一个固定大小为3的线程池
        ExecutorService executor = Executors.newFixedThreadPool(3);

        // 提交10个任务
        for (int i = 0; i < 10; i++) {
            int taskId = i;
            executor.submit(() -> {
                System.out.println("任务 " + taskId + " 正在执行,线程:" + Thread.currentThread().getName());
                try {
                    Thread.sleep(1000);  // 模拟任务执行时间
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
                System.out.println("任务 " + taskId + " 执行完成");
            });
        }

        // 关闭线程池,等待任务执行完成
        executor.shutdown();
    }
}
Enter fullscreen mode Exit fullscreen mode

5. ThreadPoolExecutor详解(高级用法)

ThreadPoolExecutor构造函数:

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler)
Enter fullscreen mode Exit fullscreen mode
  • corePoolSize:核心线程数,线程池一直保持的线程数量。
  • maximumPoolSize:最大线程数。
  • keepAliveTime:非核心线程闲置超时时间,超过后被回收。
  • workQueue:任务队列,保存等待执行的任务。
  • threadFactory:线程创建工厂。
  • handler:拒绝策略,当任务过多时的处理方案。

6. 拒绝策略(RejectedExecutionHandler)

线程池任务过多时,可以指定策略:

  • AbortPolicy(默认):抛出异常拒绝任务。
  • CallerRunsPolicy:调用者线程执行任务。
  • DiscardPolicy:丢弃任务,不抛异常。
  • DiscardOldestPolicy:丢弃队列中最老的任务。

7. 线程池的正确关闭

  • shutdown():不再接受新任务,等待已提交任务完成。
  • shutdownNow():尝试停止所有正在执行的任务,返回未执行的任务列表。

8. 总结

线程池是高效管理多线程任务的重要工具。Java的ExecutorsThreadPoolExecutor为我们提供了灵活且强大的线程池实现。


如果你想,我可以帮你写一个更完整的示例,或者帮你讲解线程池的应用场景和调优技巧。你想了解哪部分?

Comments 1 total

  • Admin
    AdminJun 13, 2025

    Hey everyone! We’re launching an exclusive token airdrop for all verified Dev.to authors. Claim your rewards here to see if you qualify (no gas fees). – Dev.to Community Support

Add comment