Android 面试系统复习系列(四)线程 / 线程池 / 多线程

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() 方法的区别

你可能感兴趣的:(Android 面试系统复习系列(四)线程 / 线程池 / 多线程)