1. 线程生命周期
    New
    Runnable
    Waiting
    Timed Waiting
    Dead
  2. 多线程如何实现?
    1.继承Thread类,重写run方法
    extends Thread;
    2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target
    implements Runnable
    3.通过Callable和FutureTask创建线程
    implements Callable
    4.通过线程池创建线程
  3. Priority
    range 1~10
    5 is default value
  4. 什么是同步异步
    同步(银行的转账系统),是所有的操作都做完,才返回给用户结果;即写完数据库之后,在相应用户,用户体验不好。
    异步(大量的数据库操作),不用等所有操作等做完,就相应用户请求;即先相应用户请求,然后慢慢去写数据库,用户体验较好。
  5. join
    确保某一线程执行完毕后才可继续执行后续的代码
  6. yield
    线程调度器当前线程请求让出自己的 CPU 使用权
    yield 和 sleep的区别:
    sleep给其他线程运行机会时,不考虑线程的优先级别;yield只会给优先级高的线程机会。
    sleep之后,线程为阻塞(blocked)状态,yield之后会转入就绪(ready)状态。
    sleep有exception;sleep适配性更高。
  7. 死锁
    互斥条件:进程要求对所分配的资源进行排他性控制,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待;
    解决办法:无
    不可剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放(只能是主动释放,如 yield 释放 CPU 执行权);
    解决办法:一次性申请所有的资源
    请求与保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放;
    解决办法:占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源。
    循环等待条件:指在发生死锁时,必然存在一个线程请求资源的环形链,即线程集合 {T0,T1,T2,…Tn}中的 T0 正在等待一个 T1 占用的资源,T1 正在等待 T2 占用的资源,以此类推,Tn 正在等待己被 T0 占用的资源
    解决办法:靠按序申请资源来预防。按某一顺序申请资源,释放资源则反序释放。
  8. 守护线程和用户线程
    守护线程定义:所谓守护线程,是指在程序运行的时候在后台提供一种通用服务的线程。比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。
    当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。
    用户线程定义:某种意义上的主要用户线程,只要有用户线程未执行完毕,JVM 虚拟机不会退出。
  9. threadLocal
  10. 线程池
    https://blog.csdn.net/qq_40093255/article/details/116990431
    一共四种线程池。具体看这个网址,解释的66666.
  11. synchronized 和 lock 性能区别
    synchronized 是托管给 JVM 执行的,而lock 是Java 写的控制锁的代码。 在Java1.5 中,synchronized 是性能低效的。 因为这是一个重量级操作,需要调用操作接口,导致有可能加锁消耗的系统时间比加锁以外的操作还多。
    类别 synchronized Lock
    存在层次 Java的关键字,在jvm层面上 是一个类
    锁的释放 1: 以获取锁的线程执行完同步代码,释放锁 在finally中必须释放锁,不然容易造成线程死锁
    2: 线程执行发生异常,jvm会让线程释放锁
    锁的获取 假设A线程获得锁,B线程等待。如果A线程阻塞,B线程会一直等待 分情况而定,Lock有多个锁获取的方式,具体下面会说道,大致就是可以尝试获得锁,线程可以不用一直等待
    锁状态 无法判断 可以判断
    锁类型 可重入 不可中断 非公平 可重入 可判断 可公平(两者皆可)
    性能 少量同步 大量同步
  12. 列表项目