Java并发编程
`
一、操作系统进程状态转换
二、Java线程转换
1. Java线程状态分类
从Java API(Thread.State)层面来描述,Java线程有六种状态:
1、NEW —— 线程刚被创建,但是还没有调用start()方法
2、RUNNABLE —— 当调用了start()方法之后
注意:Java API层面的RUNNABLE状态包含了操纵系统层面的运行状态和阻塞状态
3、BLOCKED、WAITTING、TIMED_WAITTING都是Java API层面对操作系统阻塞状态的细分
4、TERMINATED 当线程代码运行结束
2.线程状态转换详解
假设存在Thread t
-
NEW ——> RUNNABLE
当调用t.start()方法时,线程t由NEW ——> RUNNABLE -
RUNNABLE<——> WAITING
当线程t使用 synchronized(obj) 获得对象锁之后
1、调用obj.wait(),线程t从RUNNABLE——> WAITING
2、调用obj.notify() obj.notifyAll() t.interrupt()时
竞争锁成功,线程t WAITING ——> RUNNABLE
竞争锁失败,线程t WAITING ——> BLOCKED -
RUNNABLE<——> WAITING
1、当当前线程调用t.join(),当前线程从RUNNABLE——> WAITING
注意:是当前线程在线程t的对象监视器上等待
2、线程t运行结束或调用了当前线程的interrupt()时,当前线程从 WAITING ——> RUNNABLE -
RUNNABLE <——> WAITING
1、当前线程调用LockSupport.park() 会让当前线程从 RUNNABLE ——> WAITING
2、调用LockSupport.unpark(目标线程)或调用了目标线程的interrupt(), 会让目标线程从WAITING ——> RUNNABLE -
RUNNABLE <——> TIMED_WAITING
1、当当前线程调用 t.join(long n)时,当前线程从RUNNABLE ——> TIMED_WAITING
注意:是当前线程在线程t对象的监视器上等待
2、当当前线程等待时间超过了n毫秒或线程t运行结束或调用了当前线程的iterrupt(),当前线程从TIMED_WAITING ——> RUNNABLE -
RUNNABLE <——> TIMED_WAITING
1、当前线程调用Thread.sleep(long n), 当前线程从RUNNABLE ——> TIMED_WAITING
2、当前线程等待时间超过了n毫秒,当前线程从 TIMED_WAITING ——>RUNNABLE -
RUNNABLE <——> TIMED_WAITING
1、当前线程调用LockSupport.parkNanos(long nanos) 或 LockSupport.parkUntil(long deadLine)时,当前线程从RUNNABLE ——> TIMED_WAITING
2、调用LockSupport.unpark(目标线程)或调用了目标线程的interrupt()或等待超时,或让目标线程从TIMED_WAITING ——> RUNNABLE -
RUNNABLE <——> BLOCKED
1、线程t用synchronized(obj) 获取了对象锁时如果竞争失败,从RUNNABLE ——> BLOCKED
2、持obj锁线程的同步代码块执行完毕,会唤醒该对象上所有的BLOCKED的线程重新竞争,如果其中线程t竞争成功,从BOCKLED——>RUNNABLE,其他失败的线程仍然BLOCKED -
RUNNABLE <——> TERMINATED
当前线程所有代码运行完毕,进入TERMINATED