Thread 类中的start() 和 run() 方法的区别

一、线程状态介绍

在Java当中,线程通常都有五种状态,创建、就绪、运行、阻塞和死亡。

第一是创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。

第二是就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。

第三是运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。

第四是阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞。

第五是死亡状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪。

二、start()方法介绍

1.start()方法功能介绍

start()方法来启动线程,真正实现了多线程运行。
start方法的作用就是将线程由创建状态,变为就绪状态。当线程创建成功时,线程处于创建状态,如果你不调用start( )方法,那么线程永远处于创建状态。调用start( )后,才会变为就绪状态,线程才可以被CPU运行。

2.start()执行时间

调用start( )方法后,线程的状态是就绪状态,而不是运行状态(关于线程的状态详细。线程要等待CPU调度,不同的JVM有不同的调度算法,线程何时被调度是未知的。因此,start()方法的被调用顺序不能决定线程的执行顺序。

3.注意

由于在线程的生命周期中,线程的状态由创建到就绪只会发生一次,因此,一个线程只能调用start()方法一次,多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动。

三、run()方法介绍

run()方法当作普通方法的方式调用
run( )其实是一个普通方法,只不过当线程调用了start( )方法后,一旦线程被CPU调度,处于运行状态,那么线程才会去调用这个run()方法,并且run()方法可以多次调用。

### 线程启动与执行机制 Java 中的 `Thread` 提供了两种方法来处理线程的执行逻辑:`start()` `run()`。尽管两者都与线程执行相关,但它们的作用行为有显著区别。 `start()` 方法用于启动一个新线程,它会触发 JVM 调用该线程的 `run()` 方法。调用 `start()` 后,线程进入就绪状态,等待 CPU 分配时间片来执行其任务。此时,线程是并发执行的,这意味着主线程不会阻塞以等待 `run()` 方法完成[^1]。例如: ```java Thread thread = new Thread(() -> { System.out.println("New thread running"); }); thread.start(); // 新线程开始运行 ``` 相比之下,直接调用 `run()` 方法并不会创建新的线程,而是像普通方法调用一样在当前线程中执行。这意味着如果希望实现多线程行为,则必须通过 `start()` 来激活线程[^2]。以下代码演示了这一点: ```java Thread thread = new Thread(() -> { System.out.println("Running in run method"); }); thread.run(); // 在主线程中执行 ``` 此外,`start()` 方法内部确实调用了 `run()` 方法,但是它还负责一系列初始化操作,包括将线程添加到线程组、检查线程状态等[^3]。这些额外步骤确保了线程能够正确地被操作系统调度并执行。 值得注意的是,`start()` 方法是同步的,并且只能被调用一次。尝试多次调用会导致抛出 `IllegalThreadStateException` 异常,这是因为一旦线程已经被启动,再次尝试启动它是没有意义的[^4]。 ### 相关问题 1. 如何使用 Java 创建并启动一个线程? 2. 为什么不能多次调用同一个线程对象的 start() 方法? 3. 如果不覆盖 Threadrun() 方法会发生什么? 4. 在 Java 中,如何保证线程安全地访问共享资源? 5. Java 中线程的状态有哪些以及它们之间是如何转换的? 这些问题可以帮助进一步理解掌握 Java 多线程编程的核心概念技术。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值