Posts /

Java线程为什么不能重复调用start()

06 Aug 2020

Java线程不能重复调用start()


线程的状态

Java线程的6种状态及切换(透彻讲解)

sleep方法,暂停当前线程,把cpu片段让出给其他线程,减缓当前线程的执行。

但是如果当前线程占有了锁,线程不会释放锁。

sleep过后,不是直接到了运行状态,而是到就绪(可运行)状态。

为什么不能重复调用start()

同一个线程对象不能重复调用start()。

调用一次start()之后进入可运行状态,当我们再次调用start方法的时候由于不是NEW这个状态就会抛出IllegalThreadStateException这个异常了。

1596882177407

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方法的新线程。

线程状态转换

JavaThreadState 和 JVMTIThreadState 转换

1596883974952