NEW
线程被创建,但是还没有调用start方法。
RUNNABLE
线程正在运行或者,在就绪队列当中等待OS分配CPU片段。
BLOCKED
阻塞状态,等待获得锁。例如,线程试图通过synchronized去获取某个锁,但是其他线程已经独占了,那么当前线程就会处于阻塞状态。
WAITING
等待。线程调用对象的wait方法,或者Thread的join方法而没有运行。例如生产者消费者模式下,需要调用wait()等待生产者线程notify()。
TIMED_WAITING
计时等待,其进入条件和等待状态类似,但是调用的是存在超时条件的方法,比如wait或join等方法的指定超时版本,比如调用sleep方法。
TERMINATED
结束状态。
sleep方法,暂停当前线程,把cpu片段让出给其他线程,减缓当前线程的执行。
但是如果当前线程占有了锁,线程不会释放锁。
sleep过后,不是直接到了运行状态,而是到就绪(可运行)状态。
同一个线程对象不能重复调用start()。
调用一次start()之后进入可运行状态,当我们再次调用start方法的时候由于不是NEW这个状态就会抛出IllegalThreadStateException这个异常了。
public class RunTest {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
System.out.println("I'm in the thread!");
});
thread.start();
System.out.println(thread.getState());
thread.run();
System.out.println(thread.getState());
thread.start();
}
}
/*
输出:
RUNNABLE
I'm in the thread!
I'm in the thread!
TERMINATED
Exception in thread "main" java.lang.IllegalThreadStateException
at java.base/java.lang.Thread.start(Thread.java:794)
at javatest.threadpool.RunTest.main(RunTest.java:26)
*/
但是一个线程对象可以调用多次run,因为他只是一个对象调用一个方法。但是run()方法并没有启动一个线程,只是在调用方法的线程中执行任务。事实上,应当调用thread.start()方法,因为这会创建一个执行run方法的新线程。