一、安卓线程池面试题
安卓线程池通常使用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();