Java多线程为什么使用线程池?以及工作原理

技术分享
1005 0

Java 线程池

为什么使用线程池?

  1. 节省资源:频繁地创建和销毁线程会消耗大量的系统资源。
  2. 提高响应速度:线程已经预先创建,无需再等待线程创建。
  3. 提供线程管理:可以控制线程的最大并发数,防止大量线程耗尽系统资源。

线程池的工作原理

  • 线程池在初始化时会创建一定数量的工作线程。
  • 任务提交到线程池后,会被放入一个任务队列中等待执行。
  • 工作线程会从队列中取出任务执行。
  • 当工作线程数量超过线程池的核心数量时,空闲的额外线程如果超过指定的存活时间会被销毁。

Java提供的线程池(Executors, ThreadPoolExecutor

使用 Executors 的工厂方法

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);

使用 ThreadPoolExecutor 创建线程池

int corePoolSize = 5;
int maximumPoolSize = 10;
long keepAliveTime = 1L;
TimeUnit unit = TimeUnit.MINUTES;
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(50);
ThreadFactory threadFactory = Executors.defaultThreadFactory();
RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();

ThreadPoolExecutor executor = new ThreadPoolExecutor(
    corePoolSize,
    maximumPoolSize,
    keepAliveTime,
    unit,
    workQueue,
    threadFactory,
    handler
);

自定义线程池参数

  • corePoolSize: 核心线程数,这是默认情况下线程池维护的线程数量。
  • maximumPoolSize: 最大线程数,当队列满了,且核心线程都在工作,线程池可以创建新线程,直到达到这个最大值。
  • keepAliveTime & unit: 当工作线程数量超过核心线程数量时,多余的线程会等待这个时间后,如果仍然空闲,就会被终止。
  • workQueue: 用于保存等待执行的任务的阻塞队列。
  • threadFactory: 用于创建新线程的工厂。
  • handler: 当队列和最大线程数都满了后,新提交的任务如何被处理的策略。

这是关于Java线程池的基本概念和代码示例。在真实环境中,建议避免使用 Executors 的默认方法创建线程池,因为它们往往不满足特定的需求,最好自定义参数并使用 ThreadPoolExecutor

最后更新 2023-09-23
评论 ( 0 )
OωO
隐私评论