原创

java面试题-常用的线程池有哪些?

在Java中,线程池是一种重要的多线程管理机制,可以有效地管理和利用系统中的线程资源。本教程将详细介绍常用的线程池类型,包括newSingleThreadExecutornewFixedThreadPoolnewCachedThreadPoolnewScheduledThreadPoolnewSingleThreadScheduledExecutor,并提供详细的源码解析和示例代码。

1. newSingleThreadExecutor

newSingleThreadExecutor创建一个单线程的线程池,保证所有任务的执行顺序按照任务的提交顺序执行。这种线程池适用于需要顺序执行任务的场景。

示例代码

ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(() -> System.out.println("Task 1"));
executor.submit(() -> System.out.println("Task 2"));
executor.shutdown();

源码解析

// Executors.newSingleThreadExecutor() 源码
public static ExecutorService newSingleThreadExecutor() {
    return new FinalizableDelegatedExecutorService
        (new ThreadPoolExecutor(1, 1,
                                0L, TimeUnit.MILLISECONDS,
                                new LinkedBlockingQueue<Runnable>()));
}

源码解释

  • ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()):创建一个核心线程数和最大线程数都为1的线程池,使用无界队列LinkedBlockingQueue来存储任务。

2. newFixedThreadPool

newFixedThreadPool创建固定大小的线程池,每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。适用于需要控制并发线程数的场景。

示例代码

ExecutorService executor = Executors.newFixedThreadPool(3);
for (int i = 0; i < 5; i++) {
    executor.submit(() -> System.out.println("Task " + i));
}
executor.shutdown();

源码解析

// Executors.newFixedThreadPool(int n) 源码
public static ExecutorService newFixedThreadPool(int nThreads) {
    return new ThreadPoolExecutor(nThreads, nThreads,
                                  0L, TimeUnit.MILLISECONDS,
                                  new LinkedBlockingQueue<Runnable>());
}

源码解释

  • ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()):创建一个固定大小的线程池,核心线程数和最大线程数都为nThreads,使用无界队列LinkedBlockingQueue

3. newCachedThreadPool

newCachedThreadPool创建一个可缓存的线程池,不限制线程池大小,完全依赖于操作系统(或JVM)能够创建的最大线程大小。适用于处理大量短生命周期任务的场景。

示例代码

ExecutorService executor = Executors.newCachedThreadPool();
for (int i = 0; i < 5; i++) {
    executor.submit(() -> System.out.println("Task " + i));
}
executor.shutdown();

源码解析

// Executors.newCachedThreadPool() 源码
public static ExecutorService newCachedThreadPool() {
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                  60L, TimeUnit.SECONDS,
                                  new SynchronousQueue<Runnable>());
}

源码解释

  • ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()):创建一个可缓存的线程池,核心线程数为0,最大线程数为Integer.MAX_VALUE,存活时间为60秒,使用同步队列SynchronousQueue

4. newScheduledThreadPool

newScheduledThreadPool创建一个大小无限的线程池,支持定时以及周期性执行任务的需求。适用于需要定时执行任务的场景。

示例代码

ScheduledExecutorService executor = Executors.newScheduledThreadPool(2);
executor.schedule(() -> System.out.println("Delayed Task"), 5, TimeUnit.SECONDS);
executor.scheduleAtFixedRate(() -> System.out.println("Periodic Task"), 1, 3, TimeUnit.SECONDS);

源码解析

// Executors.newScheduledThreadPool(int corePoolSize) 源码
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
    return new ScheduledThreadPoolExecutor(corePoolSize);
}

源码解释

  • ScheduledThreadPoolExecutor(corePoolSize):创建一个大小无限的定时线程池。

5. newSingleThreadScheduledExecutor

newSingleThreadScheduledExecutor创建一个单线程的线程池,支持定时以及周期性执行任务的需求。适用于需要顺序执行定时任务的场景。

示例代码

ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
executor.schedule(() -> System.out.println("Delayed Task"), 5, TimeUnit.SECONDS);
executor.scheduleAtFixedRate(() -> System.out.println("Periodic

 Task"), 1, 3, TimeUnit.SECONDS);

源码解析

// Executors.newSingleThreadScheduledExecutor() 源码
public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
    return new DelegatedScheduledExecutorService
        (new ScheduledThreadPoolExecutor(1));
}

源码解释

  • ScheduledThreadPoolExecutor(1):创建一个单线程的定时线程池。

总结

通过本教程,我们深入了解了常用线程池的类型、适用场景,并提供了详细的源码解析和示例代码。选择合适的线程池类型可以有效管理多线程资源,提高系统性能。

正文到此结束
本文目录