官方文档声明了以下几种线程的状态。
1.新建(New):
创建后尚未开启的线程的状态(新创建了一个线程对象,但还没有调用start方法)。
2.运行(Runnable):
包含Running(正在执行)和Ready(就绪,等待cpu时间片)。
处于Running状态的线程位于可运行介质之中,等待被线程调度选中,获取cpu的使用权。处于Ready状态的线程处于线程池中,等待线程调度选中,获取cpu的使用权。处于Ready状态的线程获得cpu时间后,就变成Running状态的线程。
3.无限期等待(Waiting):
不会被分配CPU执行时间,需要显式被唤醒。
以下有三种可以使线程处于Waiting状态的情况:
(1)没有设置Timeout参数的Object.wait()方法。
(2)没有设置Timeout参数的Thread.join()方法。
(3)LockSupport.park()方法。
4.限期等待(Time Waiting):
在一定时间后会由系统自动唤醒。
以下由五种可以使线程处于TimeWaitting状态的情况。
Thread.sleep()方法。
设置了Timeout参数的Object.wait()方法。
设置了Timeout参数的Thread.join()方法。
LockSupport.parkNanos()方法。
LockSupport.parUntil()方法。
5.阻塞(Blocked):
等待获取排它锁。
6.结束(Terminated):
已终止线程的状态,线程已经结束执行。(线程的run方法完成或者main方法完成时)
在一个终止的线程调用start方法会报异常:
public class ThreadTest {
private static void attack(){
System.out.println("Fight");
System.out.println("Current Thread is: "+ Thread.currentThread().getName());
}
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(){
public void run(){
attack();
}
};
System.out.println("current main thread is : "+ Thread.currentThread().getName());
t.start();
//使主线程等待子线程执行完成
t.join();
//等子线程执行完后再让子线程复活
t.start();
}
}
运行结果:
Exception in thread "main" java.lang.IllegalThreadStateException
at java.lang.Thread.start(Thread.java:708)
at com.jerry.interview.thread.ThreadTest.main(ThreadTest.java:20)