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

相关推荐
小羊没烦恼!1 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
俊昭喜喜里1 天前
java中的继承和多态的区别
java
小羊没烦恼!1 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕1 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码1 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖1 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时1 天前
01-06-A-JVM排查实战详解
java·jvm
伞伞悦读1 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
vipxieliang1 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
C语言小火车1 天前
C/C++ 为什么需要编译器?
开发语言·c++