梳理了一下知识结构:
生命周期:
线程在Running的过程中可能会遇到阻塞(Blocked)情况
- 调用join()和sleep()方法,sleep()时间结束或被打断,join()中断,IO完成都会回到Runnable状态,等待JVM的调度。
- 调用wait(),使该线程处于等待池(wait blocked pool),直到notify()/notifyAll(),线程被唤醒被放到锁定池(lock blocked pool ),释放同步锁使线程回到可运行状态(Runnable)
- 对Running状态的线程加同步锁(Synchronized)使其进入(lock blocked pool ),同步锁被释放进入可运行状态(Runnable)。
此外,在runnable状态的线程是处于被调度的线程,此时的调度顺序是不一定的。Thread类中的yield方法可以让一个running状态的线程转入runnable。
线程本身不带结束方法,所以得自己实现结束线程原理:就是让run方法结束。而run方法中通常会定义循环结构,所以只要控制住循环即可,可以boolean标记的形式完成,只要在某一情况下将标记改变,让循环停止即可让线程结束
线程间通信:1同步
Synchronized 2.wait/notify机制