一、安卓线程池面试题
安卓线程池通常使用 ThreadPoolExecutor
类,该类实现了 ExecutorService
接口来提供线程的管理。而在安卓应用中常用的线程池主要有四个:
- FixedThreadPool:固定线程池
- CacheThreadPool:缓存线程池
- ScheduledThreadPool:定期或定时执行任务的线程池
- SingleThreadPool:单线程线程池
这些都是通过
ThreadPoolExecutor
类实现的,这个类同样也是 Java 线程池的重要实现类。
二、线程和线程池面试题
线程池是一种典型的对象池技术,它的主要功能是管理线程、控制线程数量、避免线程创建和销毁带来的性能开销,提升系统性能 线程池中的几个重要组成部分:
- 任务队列
- 线程池管理器
- 工作线程 线程池通常具备的优点:
- 降低资源消耗:使用线程池可以避免线程的重复创建和销毁,减少了系统资源的消耗
- 提高程序响应速度:使用线程池可以更快地响应外部请求,提高程序的响应速度,尤其是在高并发的情况下
- 提供更稳定的服务质量:由线程池管理,可以对系统中的任务进行有效的分配、统一的管理,提高服务质量和稳定性
三、线程池的工作原理面试题
线程池的核心是一种生产者-消费者的模式,生产者就是任务,消费者就是线程池中的工作线程。它们通过任务队列(COMMOND QUEUE)进行沟通。 若当前线程池中的线程数小于核心线程数,则有新任务加入时,线程池会直接创建一个新线程来处理任务;若当前线程数大于或等于核心线程数且任务队列未满,则新任务将被加入任务队列并等待处理。 若当前线程数量超过了核心线程的数量且任务队列已满,那么线程池会有一定的策略来处理这种情况,通常为线程池的拒绝策略:Abort 策略,调用者直接抛出异常;Discard 策略,直接丢弃任务;Discard-oldest 策略,丢弃时间最久的任务;Caller-runs 策略,在任务提交者的线程中运行此任务。
四、线程池七大核心参数面试题
线程池在创建时传入了七个核心参数,这些参数是线程池的容量和管理规则,涉及到线程的创建、销毁等一系列问题。
corePoolSize
:核心线程数,线程池中一般会被保持的线程的最小数量maximumPoolSize
:最大线程数,线程池中允许创建的最大线程数目keepAliveTime
:存活时间,线程池中非核心线程的空闲时间,超出这个时间就会被回收unit
:时间单位,用来指定keepAliveTime
的时间单位workQueue
:等待队列,一种存放等待任务的阻塞队列threadFactory
:线程工厂,一般用来定制新线程的执行规则,如名称、优先级、是否后台线程等handler
:拒绝策略处理器,用来处理线程池中已满状态下的新任务,通常有 Abort 策略、Discard 策略等
五、Java线程池实例示例
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
// 定义任务类型
class Task implements Runnable {
private int id;
public Task(int id) {
this.id = id;
}
public void run() {
System.out.println(Thread.currentThread().getName() + " is executing task " + id);
}
}
// 实例化线程池
ExecutorService pool = Executors.newFixedThreadPool(5);
// 提交任务给线程池
for (int i = 0; i < 10; i++) {
pool.execute(new Task(i));
}
// 关闭线程池
pool.shutdown();