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