1、RUNNABLE和BLOCKED的状态转换——线程等待synchrozied的隐式锁。
线程调用阻塞式API时,是否会转换到BLOCKED状态?
在操作系统层面,线程是会转换到休眠状态,但是在JVM层面,java线程的状态不会发生变化,也就是说java线程的状态会依然保持RUNNABLE状态,JVM层面并不关心操作系统调度相关的状态,因为在JVM看来,等待CPU使用权(操作系统层面此时处于可执行状态)与等待I/O(操作系统层面此时处于休眠状态)没有区别,都是在等待某个资源,所以都归入了RUNNABLE状态。
我们平时所谓的java在调用阻塞式API时,线程会阻塞,指的是操作系统线程的状态,并不是java线程的状态。
2、RUNNABLE 与 WAITING 的状态转换
2.1、获得synchrozied隐式锁的线程,调用无参数的Object.wait()
2.2、Thread.join(),例如有一个线程对象A,当调用A.join()的时候,执行这条语句的线程会等待threadA 执行完。
2.3、调用LockSupport.park()方法。
3、RUNNABLE 与 TIMED_WAITING 的状态转移
WAITING基础上加了超时参数