有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准
https://blog.zysicyj.top
可点击链接
https://blog-1253652709.cos.ap-guangzhou.myqcloud.com//picgo/202401180921373.png解答疑问
在正式介绍线程池之前,我们先来对线程池的类继承体系简单说明一下:
在这里有两个核心的类,ThreadPoolExector和ScheduledThreadPoolExecutor,后者不仅可以执行某个任务,还可以周期性的执行某个任务。
所有提交的任务都必须实现Runnable接口,通过excute提交
在ExcuterService中,定义了线程池关闭接口shutdowm,还定义了返回任务callable
线程池的类继承体系
在现代Java开发中,线程池 是一种常用的技术,用于管理和优化多线程应用程序的执行。了解线程池的类继承体系有助于我们更好地理解和应用线程池,以提高程序的性能和稳定性。本文将详细介绍Java线程池的类继承体系,并解释每个重要类的作用。
一、Java线程池的核心类
1. java.util.concurrent.Executor
Executor是Java并发包中的一个顶层接口,用于定义执行任务的基本框架。它只有一个方法:
public interface Executor {
void execute(Runnable command);
}
这个方法接收一个Runnable任务,并在未来的某个时间执行该任务。Executor为任务的提交提供了统一的入口,但具体的执行细节由其子类实现。
2. java.util.concurrent.ExecutorService
ExecutorService接口继承自Executor,并提供了更多的管理线程生命周期的方法,如关闭线程池、提交带返回值的任务等。其主要方法包括:
public interface ExecutorService extends Executor {
void shutdown();
List<Runnable> shutdownNow();
<T> Future<T> submit(Callable<T> task);
<T> Future<T> submit(Runnable task, T result);
Future<?> submit(Runnable task);
// 其他方法...
}
3. java.util.concurrent.AbstractExecutorService
AbstractExecutorService是ExecutorService的抽象实现类,提供了一些方法的默认实现。开发人员可以继承该类并实现自己的线程池。
4. java.util.concurrent.ThreadPoolExecutor
ThreadPoolExecutor是Java中最常用的线程池实现类,它继承自AbstractExecutorService并实现了大多数线程池的功能。其构造方法较为复杂,允许开发人员根据需求定制线程池的行为:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
// 具体实现...
}
主要参数说明: - corePoolSize:核心线程数 - maximumPoolSize:最大线程数 - keepAliveTime:线程空闲时间 - unit:时间单位 - workQueue:任务队列 - threadFactory:线程工厂 - handler:拒绝策略
5. java.util.concurrent.ScheduledThreadPoolExecutor
ScheduledThreadPoolExecutor继承自ThreadPoolExecutor,增加了定时任务调度功能,可以在指定的延迟之后或周期性地执行任务。
二、线程池的工作原理
1. 任务提交
当一个任务被提交到线程池时,线程池首先判断核心线程池是否已满。如果未满,则创建一个新的线程来执行任务;如果已满,则将任务放入任务队列中。
2. 任务执行
当有空闲的核心线程时,它会从任务队列中取出一个任务来执行。如果任务队列也满了且线程数量未达到最大线程数,则创建新的非核心线程来执行任务。
3. 线程回收
当一个线程空闲时间超过keepAliveTime,且当前线程数超过核心线程数时,线程将被终止并回收,以释放资源。
三、常用线程池实例
Java提供了一些常用的线程池实例,方便开发人员快速使用。
1. Executors.newFixedThreadPool(int nThreads)
创建一个固定线程数的线程池。示例:
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10);
2. Executors.newCachedThreadPool()
创建一个会根据需要创建新线程的线程池,但空闲线程会被回收。示例:
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
3. Executors.newSingleThreadExecutor()
创建一个单线程的线程池。示例:
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
4. Executors.newScheduledThreadPool(int corePoolSize)
创建一个支持定时任务和周期性任务执行的线程池。示例:
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
四、线程池的使用示例
以下是一个简单的线程池使用示例,展示如何提交任务并获取结果:
import java.util.concurrent.*;
public class ThreadPoolExample {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
final int index = i;
executorService.submit(() -> {
System.out.println("Task " + index + " is running");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
executorService.shutdown();
}
}
五、总结
Java线程池提供了强大的并发处理能力,通过理解其类继承体系和工作原理,我们可以更有效地管理和优化多线程程序。希望本文对你理解Java线程池有所帮助。
关键词解释: - 线程池:一种管理和复用线程的机制,避免频繁创建和销毁线程带来的性能开销。 - 核心线程数:线程池中保持的最小线程数。 - 最大线程数:线程池中允许存在的最大线程数。 - 任务队列:保存等待执行任务的队列。
如果有更多问题或需要更深入的讨论,欢迎留言交流。


