为什么启动线程不直接调用run(),而要调用start(),如果调用两次start()方法会有什么后果

系统运维2025-11-05 10:54:2762879

1位工作6年的启动小伙伴去某里P6一面,被问到这样一道面试题,线程说,不直为什么启动一个线程不直接调用run()方法,接调而要调用start()方法来启动,用r用s用两如果调用两次start()会有什么后果?而调

如果,你被问到这样一道面试,果调果你能回答出来吗?什后今天,我给大家来分享一下,启动我对这个问题的线程理解。

1、不直run()和start()的接调区别

首先回答为什么启动线程不能直接调用run()方法,而要调用start()方法,用r用s用两我从以下4个方面来回答:

第1:start()方法是而调Java线程约定的内置方法,能够确保代码在新的果调果线程上下文中运行。

第2:start()方法包含了触创建新线程的特殊代码逻辑。run()方法是我们自己写的代码,很显然没有这个能力。

第3:如果直接调用run()方法,那么它只是一个普通的方法调用,程序中依然只有一个主线程,并且只能顺序执行,需要等待run()方法执行结束后才能继续执行后面的免费源码下载代码。

第4:我们创建线程的目的是为了更充分地利用CPU资源,如果直接调用run()方法,就失去了创建线程的意义了。

2、调用两次start()的后果

了解了run()方法和start()方法的区别,那如果调用两次start()方法会有什么后果呢?在Java中,线程的start()方法只能被调用一次,如果第二次调用会抛出 IllegalThreadStateException,这是一种运行时异常,多次调用 start 被认为是编程错误。

在Java中,线程的运行状态被定义成了5个枚举值,分别是:

(1)新建(NEW),线程已经创建好了,但是还没有调用start()方法启动。

(2)就绪(RUNNABLE),这个状态下的线程可能正在运行,也可能还在就绪队列里面,等待系统分配CPU资源。IT技术网

在操作系统中,会额外区分一种状态叫做RUNNING,但是从 Java API 的角度,并不能表示出来。

(3)阻塞(BLOCKED),表示线程处于等待Monitor Lock的状态。

(4)等待(WAITING),表示线程处于条件等待状态,当触发条件后会唤醒。比如wait/notify等。

(5)计时等待(TIMED_WAIT),它和WAITING状态是一样的,只是多了一个超时条件触发机制。

(6)终止(TERMINATED),表示线程执行结束。

在Java API 中,影响线程运行状态的因素,如图所示:

在我们第一次调用 start() 方法的时候,线程可能处于终止或者其他非 NEW的状态,再次调用start()方法的时候,相当于让这个正在运行的线程重新运行一遍。不管是b2b供应网从线程安全的角度来看,还是从线程本身的执行逻辑来看,它都是不合理的。

因此,为了避免这个问题出现,Java会先去判断当前线程的运行状态。

好了,以上就是我对Java线程的start()方法和run()方法的理解。

本文地址:http://www.bhae.cn/news/40c29599664.html
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

热门文章

全站热门

常用办公软件推荐——提高工作效率的利器(多功能、易上手、高效率,选择适合你的办公软件吧!)

聊聊智能诊断模型的构建

为什么阿里巴巴禁止超过三张表join?

数据库事务与锁机制:十个核心场景 + SQL 实战案例

减少电热毯辐射的有效方法(保护身体健康关注电热毯辐射问题)

实现物联网可扩展性的三种方法

CMU15-445 数据库系统播客:查询执行模型与数据访问

Redis Cluster 高可用原理说的头头是道,这些配置不懂就是纸上谈兵

热门文章

友情链接

滇ICP备2023000592号-9