五态模型:
Java六态模型
状态转换:
运行态 -> 阻塞态
只有一种场景会触发这种转换,就是线程等待 synchronized 的隐式锁.synchronized 修饰的方法,同时只能有一个线程可以访问,某个线程获得了这个锁,其他线程就进入了阻塞态.当该线程重新获得了synchronized 隐式锁,就从阻塞态转换为运行态.
运行态->等待
共有三种情况.
- objecet的wating方法.
- Thread的join方法,线程同步.该线程会等待Thread执行完成.(调用无参数的 Thread.join() 方法。其中的 join() 是一种线程同步方法,例如有一个线程对象 thread A,当调用 A.join() 的时候,执行这条语句的线程会等待 thread A 执行完,而等待中的这个线程,其状态会从 RUNNABLE 转换到 WAITING。当线程 thread A 执行完,原来等待它的线程又会从 WAITING 状态转换到 RUNNABLE。)
第三种场景,调用 LockSupport.park() 方法。其中的 LockSupport 对象,也许你有点陌生,其实 Java 并发包中的锁,都是基于它实现的。调用 LockSupport.park() 方法,当前线程会阻塞,线程的状态会从 RUNNABLE 转换到 WAITING。调用 LockSupport.unpark(Thread thread) 可唤醒目标线程,目标线程的状态又会从 WAITING 状态转换到 RUNNABLE。
运行态->计时等待
Thread.sleep()
- Thread.join().
调用带超时参数的 Thread.join(long millis) 方法;调用带超时参数的 LockSupport.parkNanos(Object blocker, long deadline) 方法;调用带超时参数的 LockSupport.parkUntil(long deadline) 方法。这里你会发现 TIMED_WAITING 和 WAITING 状态的区别,仅仅是触发条件多了超时参数。
NEW->RUNABLE
继承Thread
- 实现Runable
