五态模型:

初始化,可运行,运行,休眠,结束.
image.png

Java六态模型

初始化,可运行,阻塞,等待,计时等待,结束
image.png

状态转换:

运行态 -> 阻塞态

只有一种场景会触发这种转换,就是线程等待 synchronized 的隐式锁.synchronized 修饰的方法,同时只能有一个线程可以访问,某个线程获得了这个锁,其他线程就进入了阻塞态.当该线程重新获得了synchronized 隐式锁,就从阻塞态转换为运行态.

运行态->等待

共有三种情况.

  1. objecet的wating方法.
  2. Thread的join方法,线程同步.该线程会等待Thread执行完成.(调用无参数的 Thread.join() 方法。其中的 join() 是一种线程同步方法,例如有一个线程对象 thread A,当调用 A.join() 的时候,执行这条语句的线程会等待 thread A 执行完,而等待中的这个线程,其状态会从 RUNNABLE 转换到 WAITING。当线程 thread A 执行完,原来等待它的线程又会从 WAITING 状态转换到 RUNNABLE。)
  3. 第三种场景,调用 LockSupport.park() 方法。其中的 LockSupport 对象,也许你有点陌生,其实 Java 并发包中的锁,都是基于它实现的。调用 LockSupport.park() 方法,当前线程会阻塞,线程的状态会从 RUNNABLE 转换到 WAITING。调用 LockSupport.unpark(Thread thread) 可唤醒目标线程,目标线程的状态又会从 WAITING 状态转换到 RUNNABLE。

    运行态->计时等待

  4. Thread.sleep()

  5. Thread.join().
  6. 调用带超时参数的 Thread.join(long millis) 方法;调用带超时参数的 LockSupport.parkNanos(Object blocker, long deadline) 方法;调用带超时参数的 LockSupport.parkUntil(long deadline) 方法。这里你会发现 TIMED_WAITING 和 WAITING 状态的区别,仅仅是触发条件多了超时参数。

    NEW->RUNABLE

  7. 继承Thread

  8. 实现Runable