JUC线程池架构
在Java开发中,线程的创建和销毁对系统性能有一定的开销,需要JVM和操作系统的配合完成大量的工作。
- JVM对线程的创建和销毁:
- 线程的创建需要JVM分配内存、初始化线程栈和线程上下文等资源,这些操作会带来一定的时间和内存开销。
- JVM需要通过与操作系统的交互进行系统调用,涉及到资源分配、权限检查等操作。
- 线程的销毁需要释放已分配的内存和其他系统资源,这也需要一定的开销。
- 操作系统对线程的管理:
- 操作系统在内核层面管理线程,每个线程都需要占用操作系统的资源,包括内存、CPU时间片、线程调度等。
- 创建和销毁线程涉及到操作系统的系统调用,如创建线程栈、设置线程上下文、更新线程调度信息等。
- 过多的线程会增加操作系统的负担,导致资源竞争和上下文切换的开销增加。
为了减少这些开销,Java引入了线程池的概念。线程池可以预先创建一定数量的线程,并重用这些线程来处理任务,从而减少线程的创建和销毁频率,提高系统的性能和效率。
使用线程池的主要优势包括:
- 减少线程创建和销毁的开销:线程池在应用启动时创建一定数量的线程,并将它们保存在池中,避免了频繁的创建和销毁操作。
- 线程重用:线程池可以重用线程来执行多个任务,避免了反复创建线程的开销。
- 动态调整线程数量:线程池可以根据任务负载情况动态调整线程数量,提高系统的处理能力和响应性能。
- 管理和监控线程:线程池提供管理和监控线程的功能,可以设置线程的优先级、超时时间等,提供更好的线程控制和调优能力。
1.JUC线程池架构
在多线程编程中,
任务都是一些经过抽象的工作单元
,而线程就是让任务异步执行的基本机制
。随着我们应用开发的扩张,线程和任务的管理也开始变得非常复杂,为了简化这些复杂的线程管理,这个时候就需要一个“管理者”,来统一管理线程及任务分配,这个就是线程池。
有关线程池接口 和 类的架构图大致如下
Executor(执行任务)
Executor是Java异步目标任务的执行者
接口,其目的就是来执行目标任务
。Executor通过execute()接口来执行已经提交的Runnable目标实例
。其目的就是将任务执行者
,任务提交者
分离开来。
Executor框架的主要目的是将任务的提交和执行进行解耦,将任务的创建和执行逻辑分离开来
。通过使用Executor框架,可以将任务的提交和执行过程进行灵活管理,并提供了一些常用的线程池实现,简化了多线程编程的复杂性。
它只包含了一个方法
public interface Executor {
/**
* Executes the given command at some time in the future. The command
* may execute in a new thread, in a pooled thread, or in the calling
* thread, at the discretion of the {@code Executor} implementation.
*
* @param command the runnable task
* @throws RejectedExecutionException if this task cannot be
* accepted for execution
* @throws NullPointerException if command is null
*/
void execute(Runnable command);
}
ExecutorService(提交任务)
ExecutorService继承Executor。他是Java中异步目标任务的执行者服务接口
,对外提供异步任务的接收服务
。ExecutorService对外提供了接收异步任务并转发给执行者的方法
,例如submit
系列方法,invoke
系列方法等。
// 向线程池提交单个任务
<T> Future<T> submit(Callable<T> task);
<T> Future<</