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

相关推荐
夜月蓝汐21 分钟前
JAVA高级第六章 输入和输出处理(一)
java·开发语言
心之语歌23 分钟前
Spring AI 聊天记忆
java·后端
求知摆渡32 分钟前
Spring Boot + MyBatis-Plus 实战中的那些“坑”与思考 —— 以身份认证服务为例
java·spring boot·postgresql
Java技术小馆37 分钟前
2025年开发者必备的AI效率工具
java·后端·面试
Lemon程序馆38 分钟前
基于 AQS 快速实现可重入锁
java·后端
玩代码39 分钟前
命令设计模式
java·命令模式·java设计模式
ilifee1 小时前
Sentinel dashboard 添加context-path后无法信息无法上传问题
java
docker真的爽爆了1 小时前
bws-rs:Rust 编写的 S3 协议网关框架,支持灵活后端接入
开发语言·后端·rust
寄思~1 小时前
PyQt5—Qt QDialog 学习笔记
开发语言·笔记·python·qt·学习
爬点儿啥1 小时前
[JS逆向] 微信小程序逆向工程实战
开发语言·javascript·爬虫·微信小程序·逆向