线程的状态有哪些?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() 方法的内容。

相关推荐
编啊编程啊程33 分钟前
gRPC从0到1系列【6】
java·rpc·kafka·dubbo·nio
weixin_417257061 小时前
Qt解决不同线程,调用对方的函数
开发语言·qt
宸津-代码粉碎机1 小时前
Redis 进阶:跳出缓存局限!7 大核心场景的原理与工程化实践
java·人工智能·redis·python
极客先躯1 小时前
Spring Statemachine 架构详解
java·spring·架构
ccccczy_2 小时前
Java微服务容器化与 Kubernetes 编排实战:从 Docker 多阶段构建到云原生弹性扩展
java·docker·kubernetes·springboot·microservices·cloudnative·containerization
梦终剧2 小时前
【Android之路】 Kotlin 的 data class、enum class、sealed interface
android·开发语言·kotlin
半夏知半秋2 小时前
基于skynet框架业务中的gateway实现分析
服务器·开发语言·后端·学习·gateway
沉木渡香3 小时前
VSCode中Java开发环境配置的三个层级(Windows版)1-3
java·windows·vscode
程序员小白条3 小时前
度小满运维开发一面
java·运维·python·职场和发展·运维开发
Leo655358 小时前
JDK8 的排序、分组求和,转换为Map
java·开发语言