java线程的几种状态分别是什么

2 02 3 年,朋友刚开始学习Java,对线程状态特别好奇。
他说,你看,NEW状态表示线程对象刚刚被创建,还没有启动。
就像一个刚出生的婴儿,什么都不懂。
那么RUNNABLE就像长大了一样,可以跑掉,但是要看CPU是否提供资源。

朋友又问,什么是BLOCKED? 我解释说,就像你想进一扇门,但门被别人占用了,你就在外面等着。
WAITING是指你主动等待,比如等待别人给你打电话或者等待任务完成。
TIMED_WAITING 表示等待有限的时间。
比如你等了5 分钟,如果5 分钟后没有人给你打电话,你就会离开。

他理解并询问RUNNABLE和BLOCKED之间的区别。
我想说RUNNABLE是一种可以运行的状态。
它可能正在运行或等待CPU 资源。
BLOCKED正在等待锁,就像你在外面等待门打开一样。

最后他说,怎么知道线程当前的状态呢? 我只想说Thread有一个getState()方法,可以检查线程当前的状态。
这就像警察检查监控以了解谁在做什么。

java线程的7种状态及其转化

嘿嘿,这个Java线程的状态解释的很详细了。
上周一位客户问我 Java 线程有多少种状态。
我跟他说了一下,但是他发现看文档都会头晕……看来我得帮你理解一下了。

新状态:这是初始状态,当线程刚刚退出且尚未启动时。
就好像你刚做的包子还在蒸笼里,还没熟。
举个例子。
2 02 3 年在上海某商场面试时,面试官问我:Thread t = new Thread();此时t的状态是什么?是的,这是新的。
你必须快速启动它,否则它会永远沉睡在那里。
RUNNABLE状态:此时线程调用start(),进入RUNNABLE状态。
但注意,它并不是真正在运行,而是在排队等待CPU分配时间片。
就像刚烤好的馒头一样,扔到案板上,等着顾客来拿。
此时,它可能会随时被 CPU 调用来运行,也可能会排队而没有轮到它运行。
2 02 3 年我在北京一家公司工作时,我写的线程在调用start()后就进入了RUNNABLE状态。

RUNNING状态:当CPU真正为该线程分配时隙时,就进入RUNNING状态并开始执行任务。
就好像顾客把包子拿走然后吃掉一样。
但是,Java 线程模型中并未显式定义 RUNNING 状态。
RUNNABLE一般被认为有两种状态:就绪和运行。
所以对于这种情况大家不用太担心,了解一下就可以了。
BLOCKED状态:线程由于某种原因被阻塞,暂时无法执行。
这些情况:
同步阻塞:比如你抢着买双十一商品,但是你抢的线程已经占用了synchronized锁,你必须等待它释放锁才能继续执行。
等待阻塞:你调用wait()方法,等待其他线程调用notify()或notifyAll()来唤醒你。
时间阻塞:如果调用sleep()或join(),或者等待I/O操作完成,也会在此期间阻塞。

就像你排队买包子,排队的人突然吐了。
只能离开等候区,到一旁去呕吐。
呕吐完毕后,返回队列。
这时,就会从WAITING状态转移到RUNNABLE状态。
WAIT 状态:此状态意味着永远等待,其他线程应该显式唤醒您。
就像你买了一些包子,但是卖包子的人突然去世了,你只能等到包子店关门了。
在这种情况下,通常使用Object.wait()、Thread.join()或LockSupport.park()方法。

TIMED_WAITING状态:这个状态是限时等待,就像你买了一些包子,但规则是只能等待1 0分钟。
如果包子店1 0分钟后就关门了,你就只能离开了。
在这种情况下,通常使用Thread.sleep()、Object.wait()、Thread.join()或LockSupport.parkNanos()、parkUntil()方法。
TERMINATED 状态:当线程完成执行或由于以下原因退出 run() 方法时发生异常时,它进入 TERMINATED 状态。
就像你吃完包子就走开一样。
一旦线程结束,就无法重新启动。
再次调用start()将抛出IllegalThreadStateException。

转换摘要:
新→可运行:调用start()。
RUNNABLE→RUNNING:处理器调度切换。
RUNNABLE → BLOCKED/WAITING/TIMED_WAITING:锁并发失败 → BLOCKED。
调用 wait()/join()→ 等待。
调用 sleep()/wait() 并设置超时 → TIMED_WAITING。
BLOCKED/WAITING/TIMED_WAITING→RUNNABLE:解锁/通知到达/超时→RUNNABLE。
RUNNING/RUNNABLE → TERMINATED:run() 方法终止执行或引发异常。

注:
BLOCKED/WAITING/TIMED_WAITING都是操作系统级别的“睡眠状态”,在Java中进行了细分,以区分不同的等待场景。
RUNNING状态在Java线程状态中没有显式定义,通常通过RUNNABLE间接表示。

一般来说,理解Java线程状态的关键是理解RUNNABLE、BLOCKED、WAITING和TIMED_WAITING之间的转换。
您可以编写更多代码,进行更多调试,并逐渐适应它。

希望我的解释可以帮助到您!如果您还有其他问题,请随时问我!

java线程有几种状态

Java线程...有五种状态,对吗?
首先创建一个新的。
也就是说,当一个新的Thread对象被创建时,它就处于一个新的状态。
事情还没有开始。
该对象存在,但未向其提供处理器和资源,因此它无法操作。

第二,准备好了。
调用start()方法后,就准备好了。
这时候我们就等待CPU共享时隙。
它可能有效,但许多线程正在等待,所以我必须劫持它。

第三,跑步。
捕获处理器后,它开始工作并执行run()方法的代码。
只要你愿意,就跑一圈并设置一个yield()方法将其传递给其他人。
或者,当时间间隔到期时,它应该停止并再次准备好。
也有可能更高优先级的线程会出现并抢占您,并且您将被中断。

四、封锁。
这种情况经常发生。
首先睡一会儿,调节睡眠(长时间),在规定的时间睡完,醒来就自动准备好。
其次,如果配置了wait(),则必须等待其他线程通知you()或notifyAll()。
第三,同步。
例如,如果在获得锁之前同步一个对象,则必须等待。
这称为同步阻塞。
此外,网络请求或文件读写等 I/O 操作在数据到达或完成之前无法继续。
这称为 I/O 阻塞。

第五,死亡。
一旦运行,run()方法就正常退出,即死亡状态。
或者他会被杀。
例如,祖先 stop() 方法(现已弃用)在停止时将立即死亡。
就别想再提起一个已经死了的话题了。
所有使用的资源(例如CPU)都返回给系统。

只有这五种:新的、就绪的、工作的、阻塞的和死亡的。
它如何变化主要取决于线程调度和同步机制。
了解这些状态将帮助您避免在编写并发程序时出现问题,例如影响性能的死锁或资源争用。