面试题答案
一键面试1. Executors.newFixedThreadPool(int nThreads)
- 创建方式:创建一个固定线程数量的线程池,线程池中的线程数量始终保持为
nThreads
。当有新任务提交时,如果线程池中有空闲线程,则直接使用;如果没有空闲线程,则任务会被放入任务队列等待,直到有线程可用。 - 适用场景:适用于对线程数量有严格限制,且任务执行时间相对较长的场景。比如,数据库连接池,因为数据库连接数量有限,过多的并发访问可能导致数据库性能下降甚至崩溃,使用固定线程数量的线程池可以有效控制并发访问量,避免数据库过载。
2. Executors.newSingleThreadExecutor()
- 创建方式:创建一个只有单个线程的线程池,所有任务按照提交顺序依次执行。当该线程执行完一个任务后,才会从任务队列中取出下一个任务执行。
- 适用场景:适用于需要顺序执行任务,并且不希望有多个线程并发执行的场景。例如,一些需要按顺序处理文件的任务,或者对资源访问需要严格串行化的场景,以避免资源竞争问题。
3. Executors.newCachedThreadPool()
- 创建方式:创建一个可缓存的线程池,如果线程池中有空闲线程则复用空闲线程,如果没有空闲线程则创建新线程执行任务。当线程空闲时间超过60秒时,线程会被回收。
- 适用场景:适用于任务执行时间短、提交任务频率高且任务数量变化较大的场景。比如,处理网页请求,网页请求通常处理时间较短,但并发量可能会在短时间内有较大波动,使用可缓存线程池可以根据实际情况动态调整线程数量,提高系统的响应速度和资源利用率。