美文网首页Android开发经验谈Android技术知识Android开发
Android 面试系统复习系列(四)线程 / 线程池 / 多线

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

作者: 老王头碎碎念 | 来源:发表于2019-05-28 18:11 被阅读13次

    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 面试系统复习系列(四)线程 / 线程池 / 多线

        本文链接:https://www.haomeiwen.com/subject/aocjtctx.html