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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、wait--notify--sleep Object obj = new Object(); obj.wait...
    fe0180bd6eaf阅读 394评论 0 1
  • 线程池ThreadPoolExecutor corepoolsize:核心池的大小,默认情况下,在创建了线程池之后...
    irckwk1阅读 902评论 0 0
  • 日志记录,现在13.47.分钟,我们三点去幼儿园接孩子,六天没有下雨了,仰望天空红红的太阳,天热孩子不愿意走,我们...
    荣兰_a5f9阅读 277评论 0 0
  • Hi式复盘 Day32/365 2019.2.14 正月初十 星期四 预期目标 当日目标是要达成19年地...
    尹建艳阅读 158评论 0 0
  • 本周太忙,繁琐的琐事太多,有幼儿运动比赛,有幼儿元旦节日准备,有拍摄祝福语,又有我自己的画画打卡,美术班,还有作业...
    舒坦一生阅读 741评论 0 0

友情链接更多精彩内容