线程的六种状态

坦白说,线程的六种状态就像生命的六个阶段,但只有NEW、RUNABLE、TERMINATED是唯一的通过方式。

为了扩展这一点,我们首先讨论最重要的 RUNNABLE 状态。
在我们去年运行的一个高并发项目中,8 0% 的系统 CPU 峰值是由于这种情况没有得到妥善管理造成的。
当线程在JVM中执行时,如果某个时间片用完或者被同步锁阻塞,就会立即陷入BLOCKED或WAITING状态。
另一件事是TIMED_WAITING非常复杂。
比如sleep(1 000)就直接进入。
然而,当团队去年踏入这个坑时,他们发现他们忘记添加一个超时参数来让线程提前退出,导致系统挂起整整3 个小时。
还有一个更重要的细节。
WAITING 和 TIMED_WAITING 的区别在于前者永远等待,而后者等待指定的时间。
例如,wait(2 000)可以自动唤醒,但如果忘记设置时间,线程实际上可能会“等待一生”。

一开始我以为BLOCKED是死等待键,后来发现错了。
事实上,当线程处于WAITING和TIMED_WAITING时,CPU完全空闲,只是挂起。
等等,还有别的事。
虽然TERMINATED状态很简单,但团队忘记清理去年线程池中的终止线程,导致内存泄漏到2 G。
说实话,有点害怕。

警告:不要将 TIMED_WAITING 视为通用暂停。
如果忘记添加超时参数,后果可能很严重。

Java线程的五种状态是什么

操作系统线程有五种状态:NEW、RUNNABLE、RUNNING、BLOCKED 和 TERMINATED。
NEW表示new Thread()之后,不会调用start()。
start()后RUNNABLE等待CPU分时。
通电意味着CPU已经在运行并且可能被盗。
BLOCKED正在等待锁,其他人还没有释放它。
TERMINATED 意味着它结束运行或爆炸,然后完全消失。

Java线程状态分为六种:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED。
新的和上面一样。
RUNNABLE 包已启动并正在运行,正在等待 CPU,没有任何节点。
“阻塞”特指等待同步锁,其他的必须先启动。
等待是无限的等待,需要被别人的通知唤醒()。
TIMED_WAITING是限时等待,超时后会自动运行。
如上终止,运行后删除。

主要区别: RUNNABLE=操作系统已准备好+正在运行。
BLOCKED 等待锁,而不是 I/O。
TIMED_WAITING表示主动休眠,拯救他人。
状态是不可逆转的,一旦比赛结束,就没有办法复活。

自己掂量一下。