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

相关推荐
李慕婉学姐1 小时前
【开题答辩过程】以《基于JAVA的校园即时配送系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·开发语言·数据库
奋进的芋圆2 小时前
Java 延时任务实现方案详解(适用于 Spring Boot 3)
java·spring boot·redis·rabbitmq
sxlishaobin3 小时前
设计模式之桥接模式
java·设计模式·桥接模式
model20053 小时前
alibaba linux3 系统盘网站迁移数据盘
java·服务器·前端
荒诞硬汉3 小时前
JavaBean相关补充
java·开发语言
提笔忘字的帝国3 小时前
【教程】macOS 如何完全卸载 Java 开发环境
java·开发语言·macos
2501_941882484 小时前
从灰度发布到流量切分的互联网工程语法控制与多语言实现实践思路随笔分享
java·开发语言
華勳全栈4 小时前
两天开发完成智能体平台
java·spring·go
alonewolf_994 小时前
Spring MVC重点功能底层源码深度解析
java·spring·mvc
沛沛老爹4 小时前
Java泛型擦除:原理、实践与应对策略
java·开发语言·人工智能·企业开发·发展趋势·技术原理