线程的状态有哪些?run()和start()方法有哪些区别?

1.1新建(New):当使用new关键字创建了一个线程对象但还没有调用其start()方法时,线程处于新建状态。

可运行/就绪(Runnable):一旦线程的start()方法被调用,线程进入就绪状态。此时,线程已经准备好执行,但是具体的执行时间取决于操作系统的调度策略。值得注意的是,在Java中,"Runnable"状态实际上包含了传统意义上的"就绪"和"运行中"两种状态。这意味着线程可能正在CPU上执行,也可能等待CPU资源而尚未开始执行。

1.2阻塞(Blocked):线程在等待获取监视器锁以进入同步代码块或方法时的状态。只有当线程成功获取到所需的锁之后,它才能从阻塞状态转换为就绪状态。

等待(Waiting):如果线程调用了某些特定的方法如Object.wait()、Thread.join()或者LockSupport.park()等,那么该线程将进入等待状态。在这种状态下,线程不会参与竞争CPU时间片,直到其他线程采取了相应的唤醒操作。

定时等待(Timed Waiting):与等待状态类似,不过这里线程是在等待一个指定的时间间隔后自动恢复,比如通过调用Thread.sleep(long millis)、Object.wait(long timeout)、Thread.join(long millis)等方法。

1.3终止(Terminated):当线程的run()方法完成执行,或者因为抛出了未捕获的异常导致线程提前结束时,线程将进入终止状态。终止后的线程不能再次启动。

2.1

run() 方法: run() 是 Runnable 接口中的一个方法,它定义了线程启动后要执行的代码。 当你创建一个实现了 Runnable 接口的类时,你需要实现 run() 方法来指定线程的任务。 如果直接调用 run() 方法,那么这段代码将在当前线程中运行,而不是在一个新的线程中。这意味着,如果从主线程或任何其他线程调用了 run(),该方法将立即被执行,并且不会创建新的线程;这相当于普通的函数调用。 run() 的主要目的是封装线程需要执行的逻辑。

start() 方法: start() 是 Thread 类的一个方法,用于启动一个新的线程。 调用 start() 方法会导致 JVM 创建一个新的线程,并在这个新线程上调用 run() 方法。 这个新线程的具体执行时间取决于操作系统的调度策略,它可能立即开始执行,也可能稍后执行。 start() 方法的主要作用是初始化线程并让其进入就绪状态,等待CPU调度。

总结:

直接调用 run() 就像调用普通的方法一样,不会开启新的线程。 调用 start() 则会真正地创建一个新的线程,在这个新线程中执行 run() 方法的内容。

相关推荐
独自归家的兔5 分钟前
Java反射之根:Class类生成机制深度剖析与最佳实践
java·开发语言
请叫我聪明鸭18 分钟前
基于 marked.js 的扩展机制,创建一个自定义的块级容器扩展,让内容渲染为<div>标签而非默认的<p>标签
开发语言·前端·javascript·vue.js·ecmascript·marked·marked.js插件
悟能不能悟19 分钟前
Gson bean getxxx,怎么才能返回给前端
java·前端
Apex Predator26 分钟前
本地库导入到nexus
java·服务器·前端
仍然.30 分钟前
Java---反射、枚举、lambda表达式 和 泛型进阶
java·开发语言
Zsy_05100337 分钟前
【C++】类和对象(二)
开发语言·c++
Duang007_42 分钟前
【万字学习总结】API设计与接口开发实战指南
开发语言·javascript·人工智能·python·学习
小北方城市网1 小时前
JVM 调优实战指南:从问题排查到参数优化
java·spring boot·python·rabbitmq·java-rabbitmq·数据库架构
一叶星殇1 小时前
C# .NET 如何解决跨域(CORS)
开发语言·前端·c#·.net
Elieal1 小时前
Java项目密码加密实现详解
java·开发语言