1. NEW -> RUNNABLE
- 创建线程后是 NEW 状态(只是 Java 层面新建的,还没有关联到操作系统实际的线程上),调用线程的 start() 方法会将 Java 线程和操作系统的线程关联起来,进入 RUNNABLE 状态
2. RUNNABLE <-> WAITTING
- wait/notify
- 线程 t 获取到锁之后调用 obj.wait(),进入 WAITTING
- 调用 obj.notify() obj.notifyAll() obj.interrupt() 唤醒线程,线程竞争锁,竞争成功进入 RUNNABLE,竞争失败进入 BLOCKED 状态
- join
- 当前线程调用 t.join() 方法,当前线程由 RUNNABLE -> WAITTING,注意是当前线程在 t 线程对象的监视器上等待
问题?当前线程在线程 t 的锁对象上等待,释放时候不需要去抢夺锁,怎么标识不去抢夺?只是需要等待 t 线程运行结束,然后自己继续运行就好了
- t 线程运行结束或者调用了 t.interrupt() 方法,当前线程 从 WAITTING -> RUNNABLE
- park/unpark
- 当前线程调用 LockSupport.park() 回让当前线程由 RUNNABLE -> WAITTING
- 当前线程调用 LockSupport.unpark(目标线程),或者线程的 interrupt(),会让目标线程从 WAITTING -> RUNNABLE
3. RUNNABLE <-> TIMED_WAITTING
- wait(timeout)(先获取到对象锁)
- 调用 wait(timeout) 进入 TIMED_WAITTING 状态
- timeout 时间到期,从 TIMED_WAITTING -> RUNNABLE
- 调用 obj.notify() obj.notifyAll() obj.interrupt() 唤醒线程,线程竞争锁,竞争成功进入 RUNNABLE,竞争失败进入 BLOCKED 状态
- join(timeout)
- sleep(timeout)
- park(timeout)
4. RUNNABLE <-> BLOCKED
- 运行线程竞争锁失败 synchronized(obj),从 RUNNABLE -> BLOCKED
- 持有锁 obj 的线程同步代码块执行完毕,释放锁会唤醒阻塞在该对象锁上的所有线程(BLOCKED 状态),线程重新竞争锁,竞争成功由 BLOCKEDE -> RUNNABLE,竞争失败还是 BLOCKED
5. RUNNABLE -> TERMINATED
- 当前线程执行完毕,进入终止状态