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

相关推荐
a31582380615 分钟前
Android Framework开发知识点整理
android·java·linux·服务器·framework·android源码开发
freedom_1024_23 分钟前
【c++】使用友元函数重载运算符
开发语言·c++
毕设源码-朱学姐34 分钟前
【开题答辩全过程】以 个人健康管理系统为例,包含答辩的问题和答案
java·spring boot
San30.38 分钟前
深入理解 JavaScript OOP:从一个「就地编辑组件」看清封装、状态与原型链
开发语言·前端·javascript·ecmascript
局外人Inside40 分钟前
PostProcessingBeanDeserializer 使用指南
java
郑州光合科技余经理43 分钟前
基于PHP:海外版同城O2O系统多语言源码解决方案
java·开发语言·git·spring cloud·uni-app·php·uniapp
zmzb01031 小时前
C++课后习题训练记录Day43
开发语言·c++
IT_Octopus1 小时前
Java GZip 压缩实践 +实践思考 +进一步压榨性能和存储方案思考:Protobuf+ GZip
java·spring boot
wadesir1 小时前
C语言模块化设计入门指南(从零开始构建清晰可维护的C程序)
c语言·开发语言·算法
t198751281 小时前
MATLAB水声信道仿真程序
开发语言·算法·matlab