Android 面试系统复习系列(四)线程 / 线程池 / 多线程
线程
线程的状态
- New 当 New Thread(r) 时,还没有调用 start 方法,就会处于这个状态
- Runnable 当调用 start 方法后,处于该状态
- Blocked 当一个线程视图获取一个内部的对象锁,而该锁被其他线程持有,此时会进入阻塞状态
- Waiting 当调用 Object.wait() 或者 Thread.join(), 会进入该状态
- Timed waiting 当调用带超时时间的 Object.wait() 或者 Thread.join() 方法后,会处于计时等待
- Terminated 执行完任务正常终止,或者未捕获异常意外终止,会处于该状态
线程池
为什么要使用线程池
在任务众多的情况下,系统要为每一个任务创建一个线程,而任务执行完毕后会销毁每一个线程,所以会造成线程频繁地创建与销毁。
而线程池对线程进行复用,线程在执行完任务后不会立刻销毁,而会等待另外的任务,这样就不会频繁地创建、销毁线程和调用GC。
ThreadPoolExecutor 构造方法中的参数
- corePoolSize 该线程池中核心线程的数量
- maximumPoolSize 该线程池中最大线程数量
- keepAliveTime 非核心线程闲置时的超时时长,当 ThreadPoolExecutor 的 allowCoreThreadTimeOut 设为 true 时,同样会作用于核心线程
- unit 上面参数的时间单位
- workQueue 线程池的任务队列,通过线程池的 execute 方法提交的 Runnable 对象会存储在这里
几种常见的线程池
- FixedThreadPool 参数为核心线程数,只有核心线程,无非核心线程,并且阻塞队列无界
- CachedThreadPool 没有核心线程,只有非核心线程,并且每个非核心线程空闲等待的时间为60s
- SingleThreadPool 只有一个核心线程,无需考虑多线程同步问题
- ScheduledThreadPool 可以定时延时执行
多线程同步相关
volatile 关键字
Java 提供的最轻量级的同步机制
当用 volatile 定义一个变量时,变量将具备两种特性:
- 此变量对所有线程保持可见性
- 禁止指令重排序优化
需要注意的是,volatile 提供的可见性并不会保证基于 volatile 变量的运算是线程安全的。这里提供的可见性是指在拿到这个变量的值的时候是最新的,因为每次读值的时候都会强制从主内存刷新值,但是再后续的运算中可能就是过期的值了。
synchronized
同步代码块,使用时注意下对象锁和类锁的区别
精心挑选的面试题
1、什么是死锁,如何分析,如何避免
2、ThreadPoolExecutor 构造函数中各参数含义,以及 android 中常见线程池的应用场景
3、Thread.sleep() 和 Object.wait() 方法的区别
网友评论