我们可以通过下面的这段代码来查看线程一共有哪几种状态
//线程的状态是一个枚举类型 Thread.State for(Thread.State state : Thread.State.values()){ System.out.println(state); }
NEW(新建状态): 当线程对象已经被创建,但是 start() 方法还没有被调用。
RUNNABLE(就绪状态):当线程已经调用了 start() 方法,线程已经在cpu上运行或等待运行。
TERMINATED(终止状态):说明当前线程已经工作结束,Thread 对象还在,但是内核上的线程已经销毁了。
TIMED_WAITING(有时限等待状态):与 WAITING 类似,但有一个超时时间限制,通常是由于调用了 sleep() wait(timeout) join(timeout) 等固定时间产生的阻塞。
WAITING(等待状态):当线程等待某个特定条件的发生,通常是由于调用了 wait()、join()或 park()等方法时,线程处于等待状态。
BLOCKED(阻塞状态):由锁竞争导致的阻塞。
我们来看下面的代码
public class demo { public static void main(String[] args) throws InterruptedException { Thread t = new Thread(()->{ for (int i = 0; i < 10; i++) { try { //此时t线程在sleep中获取的状态 可能是RUNNABLE 也可能是 TIMED_WAITING Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } }); System.out.println("t线程调用前状态:"+t.getState()); //启动t线程 t.start(); //循环获取状态 总会把这两种状态都获取到 具体获取到哪个状态取决于系统调度 for (int i = 0; i < 20; i++) { System.out.println("线程执行中状态:"+t.getState()); } //让主线程等待t线程执行完 t.join(); //获取t线程结束后的状态 System.out.println("t线程结束后:"+t.getState()); } }
在创建一个线程还没有start()的时候 ,它的状态就是 NEW ,调用start() 后也就是意味着线程进入就绪状态 也就是 RUNNABLE,等待系统调度。当执行任务时,遇到了 sleep() ,这个时候线程不会被分配cpu资源,此时线程的状态是 TIMED_WAITING ,当线程的任务执行完毕时也就是run() 方法结束,此时线程状态是 TERMINATED。