java面试题-常用的线程池有哪些?
在Java中,线程池是一种重要的多线程管理机制,可以有效地管理和利用系统中的线程资源。本教程将详细介绍常用的线程池类型,包括newSingleThreadExecutor
、newFixedThreadPool
、newCachedThreadPool
、newScheduledThreadPool
、newSingleThreadScheduledExecutor
,并提供详细的源码解析和示例代码。
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)
:创建一个单线程的定时线程池。
总结
通过本教程,我们深入了解了常用线程池的类型、适用场景,并提供了详细的源码解析和示例代码。选择合适的线程池类型可以有效管理多线程资源,提高系统性能。
- 本文标签: Java 面试题
- 本文链接: https://www.jietongc.com/article/103
- 版权声明: 本文由大熊科技原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权