面试题答案
一键面试线程池中线程复用原理
- 核心线程:线程池初始化后,会创建一定数量的核心线程。这些核心线程会一直存活在线程池中,不会因为空闲而被销毁(除非设置了允许核心线程超时)。
- 任务队列:当有新任务提交到线程池时,会首先尝试将任务放入任务队列。任务队列是一个存储任务的容器,它根据线程池采用的策略不同,有不同的实现(如 ArrayBlockingQueue、LinkedBlockingQueue 等)。
- 工作线程:核心线程会不断从任务队列中获取任务并执行。当一个核心线程执行完当前任务后,并不会终止,而是继续从任务队列中获取下一个任务,这就实现了线程的复用。
- 非核心线程:如果任务队列已满,且当前运行的线程数小于线程池的最大线程数,线程池会创建非核心线程来执行任务。同样,非核心线程执行完任务后,如果空闲时间超过了设置的 keepAliveTime,就会被销毁;否则也会从任务队列中获取新任务继续执行,实现复用。
对系统性能的提升
- 减少线程创建开销:线程的创建和销毁需要消耗系统资源,包括内存分配、线程上下文切换等。线程复用避免了频繁创建和销毁线程,大大减少了这些开销,提高了系统的响应速度。
- 提高资源利用率:通过复用线程,线程池可以有效控制线程的数量,避免因为线程过多导致系统资源耗尽(如内存溢出、CPU 上下文切换开销过大等)。同时,合理的线程数量可以更好地利用 CPU、I/O 等资源,提高系统整体的并发处理能力。
- 降低上下文切换开销:线程上下文切换会消耗 CPU 时间。线程复用减少了线程的创建和销毁,也就减少了上下文切换的次数,使得 CPU 可以更多地用于执行实际的任务,从而提高了系统的性能。