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线程安全?别担心,只要你不写并发代码就好了!

相关推荐
小冉在学习13 分钟前
day53 图论章节刷题Part05(并查集理论基础、寻找存在的路径)
java·算法·图论
代码之光_19801 小时前
保障性住房管理:SpringBoot技术优势分析
java·spring boot·后端
ajsbxi1 小时前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet
StayInLove1 小时前
G1垃圾回收器日志详解
java·开发语言
对许1 小时前
SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“
java·log4j
lzhlizihang1 小时前
【Hive sql 面试题】求出各类型专利top 10申请人,以及对应的专利申请数(难)
大数据·hive·sql·面试题
无尽的大道1 小时前
Java字符串深度解析:String的实现、常量池与性能优化
java·开发语言·性能优化
小鑫记得努力2 小时前
Java类和对象(下篇)
java
binishuaio2 小时前
Java 第11天 (git版本控制器基础用法)
java·开发语言·git
zz.YE2 小时前
【Java SE】StringBuffer
java·开发语言