java 线程有哪些状态,这些状态之间是如何转化的

上周。
我那个朋友。
问了我Java线程状态的问题。

新建。
new语句创建。
就在内存里。
没别的。

等待。
new之后。
start之前。
是这个状态。

就绪。
start了。
进就绪状态。
在可运行池里。
等CPU。

运行。
占用CPU。
执行代码。
一个CPU时候。
同一时间一个。

阻塞。
放弃CPU。
暂停运行。
等重新就绪。
才有CPU机会。

死亡。
run完。
或者异常没捕获。
run方法退出了。
生命周期结束。

调整优先级。
可以。
给线程排序。

sleep。
让线程自己停。
停多久。
指定毫秒数。

yield。
让步。
同优先级或更高。
让CPU给别人。

join。
当前线程等另一个。
等对方结束了。
自己才走。

从阻塞到就绪。
几种情况。

sleep完。
时间到了。
就是。

等I/O。
I/O完了。
就是。

等锁。
别人放了锁。
就是。

等条件。
别人发信号了。
条件变了。
就是。

超时了。
时间到了。
解除阻塞。

现在不用suspend了。
那个过时了。

用sleep。
替代一下。
算了。

java线程有几种状态

说白了,Java线程就五种状态,但坑点不少。

展开讲,就绪状态是关键分水岭——去年我们跑的那个高并发项目,就绪队列里3 000量级的线程,CPU一抖直接雪崩效应,用行话说叫雪崩效应,其实就是前面一个小延迟把后面全拖垮了。
另外一点,阻塞状态里睡眠阻塞和等待阻塞最容易踩坑,去年团队差点被一个忘记sleep()的线程拖死,后来发现不对劲,改用Timer定时器才搞定。
还有个细节挺关键的,死亡状态虽然简单,但stop()强行终止线程会让锁状态混乱,去年差点把数据库锁死。

我一开始也以为同步阻塞就是加synchronized就行,后来发现不对,得配合volatile保证可见性,说实话挺坑的。

建议多跑几个真实场景试试,别光看文档。

Java线程的五种状态是什么

操作系统层面: 1 . NEW:线程对象创建后,还没启动。
2 . RUNNABLE:启动后,准备运行或正在运行。
3 . RUNNING:正在运行,具体执行任务。
4 . BLOCKED:因为资源等待被阻塞。
5 . TERMINATED:运行结束或异常结束。

Java语言层面: 1 . NEW:对象创建,还没启动。
2 . RUNNABLE:启动后,等待CPU分配。
3 . BLOCKED:锁等待,被同步块或其他线程阻塞。
4 . WAITING:无限期等待,需要其他线程唤醒。
5 . TIMED_WAITING:有限期等待,超时后可恢复。
6 . TERMINATED:已结束,资源已回收。

状态转换:
RUNNABLE与操作系统就绪/运行状态对应。

BLOCKED、WAITING、TIMED_WAITING对应不同等待。

从NEW到TERMINATED状态转换不可逆。