Java口试题:假如你这样做,你会悔恨的,两次启动同一个线程~~~
当一个线程被启动后,假如再次调start()方法,将会抛出IllegalThreadStateException非常。这是因为Java线程的生命周期只有一次。调用start()方法会导致系统在新线程中运行执行体,但是假如线程已经结束,则不能再次使用,需要重新创建一个新的线程对象并调用start()方法。
以下是代码示例:
public class ThreadTest {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Thread started");
}
});
// 第一次调用start方法
thread.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 第二次调用start方法,会抛出IllegalThreadStateException异常
thread.start();
}
}上述代码中,我们在一个新的线程中启动了一个执行体,并等候1秒钟后再次调用 start()方法。在第二次调用start()方法时,由于该线程已经执行完毕,此时会抛出IllegalThreadStateException非常。
测试结果:
Thread started
Exception in thread "main" java.lang.IllegalThreadStateException
at java.lang.Thread.start(Thread.java:708)
at com.gmb.springcloud.ThreadTest.main(ThreadTest.java:20)Java线程是一种利用系统级别的资源,线程的启动和结束都需要涉及到对应的利用系统调度。在Java中,每个线程只能被启动一次,并且一旦线程结束,它的状态就不能再改变。这也是为什么假如同一个线程对象调用了两次start()方法会抛出 IllegalThreadStateException非常的缘故原由。
在底层实现上,当我们调用Thread类的start()方法时,JVM会首先检查当前线程的状态是否为NEW(新建)状态,假如不是,则抛出非常。假如当前线程状态正确,则将该线程到场到调度队列中等候利用系统调度执行。此时,线程的状态会从NEW转换为 RUNNABLE(可运行)状态,并开始执行其中的run()方法。由于一个线程只能被执行一次,因此当我们实验再次调用start()方法时,JVM会检测当前线程状态是否处于已结束(TERMINATED)状态或者死亡(DEAD)状态。假如是,那么该线程无法被重新启动,因为该线程已经完成了所需的任务并退出了。
综上所述,每个线程只能被启动一次,不能重复启动。这也是为什么假如一个线程两次调用start()方法就会抛出非常的缘故原由。
往期口试题:
Java口试题:@PostConstruct、init-method和afterPropertiesSet执行顺序?
Java口试题:SimpleDateFormat是线程安全的吗?使用时应该注意什么?
Java口试题:细数ThreadLocal大坑,内存走漏本可制止
Java口试题:请谈谈对ThreadLocal的明白?
Java口试题:为什么HashMap不建议使用对象作为Key?
Java口试题:你知道Spring的IOC吗?那么,它为什么这么重要呢?
Java口试题:线程池内“闹情绪”的线程,怎么办?
Java口试题:Spring Bean线程安全?别担心,只要你不写并发代码就好了!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]