不明白, JDK 源码中大量的死循环为什么没导致 CPU 100%,而我写一个 while(true)一下子就 CPU 跑满了。

2019-11-22 10:31:31 +08:00
 jeffh
困惑了许久的问题,google 了没找到满意的答案。
9644 次点击
所在节点    程序员
45 条回复
exip
2019-11-22 12:17:06 +08:00
人家那是有退出条件的死循环,你这是无条件的死循环.
JingW
2019-11-22 12:21:02 +08:00
你 await 一下你也不占 CPU
XiLemon
2019-11-22 13:05:23 +08:00
@jeffh #20 你这个代码贴的,里面不是有阻塞的方法么。。。
ipwx
2019-11-22 13:07:35 +08:00
这种典型就是操作系统原理没学过才会发出的疑问。科班还是有科班的底蕴的。
ipwx
2019-11-22 13:11:01 +08:00
这么说吧,线程占用 cpu 必须是在运行,而线程被操作系统调度才会被运行。因为 io 或者其他原因阻塞,线程会进入操作系统的等待队列,不会被运行。线程即使不进入阻塞,也不一定一直运行,操作系统随时可以打断线程,让它暂停,让渡资源给别的线程运行一段时间,再切换回来。当然资源充足情况下操作系统一般不会主动打断线程运行。
opengps
2019-11-22 13:21:49 +08:00
死循环不可怕,可怕的是死循环内部不休息
misaka19000
2019-11-22 13:26:47 +08:00
楼主基础堪忧
Raymon111111
2019-11-22 13:29:54 +08:00
死循环但并不占用 cpu

不知道这么讲能不能明白
watzds
2019-11-22 13:30:36 +08:00
贻笑大方
HypoChen
2019-11-22 13:42:09 +08:00
php01
2019-11-22 13:51:06 +08:00
@ipwx 科班的就是厉害,要我来描述我就只能蹦出 4 个字:时间切片了,我可说不出这么长一串来
enenaaa
2019-11-22 13:56:39 +08:00
楼主三年经验看不懂这个代码不应该啊。
axwz88
2019-11-22 14:34:19 +08:00
楼主你这问题也太没水平了吧。。。
onice
2019-11-22 15:19:52 +08:00
以前我在项目中实现生产和消费也出现过这个问题,最大的原因就在于没有用阻塞方法。
realpg
2019-11-22 15:33:09 +08:00
我觉得楼上的所有人对死循环的理解都有问题……
那种能自身条件打断的不叫死循环吧……
mxT52CRuqR6o5
2019-11-22 15:36:18 +08:00
这不是被 try 包着,有异常就结束循环了,叫哪门子的死循环
jeffh
2019-11-22 15:47:48 +08:00
@php01 这我就不同意了,难道 while(true)时间就不切片了?我是科班出身,可能没大家牛 b 吧。
jeffh
2019-11-22 16:13:05 +08:00
@mxT52CRuqR6o5 #36 老哥,不能这么想啊,有异常就结束循环,如果人家程序就没异常呢。
mccreefei
2019-11-22 16:15:55 +08:00
设定了一个 task 需要到今晚零点执行,不是会计算 delay,然后 awaitNanos(delay)。没有任务也会 await(),这里死循环怎么就 cpu100%了?
meik2333
2019-11-22 16:22:52 +08:00
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Condition.html#awaitNanos-long-

我不会 Java,使用 `RunnableScheduledFuture await` 关键词从 Google 搜到了上面的链接。

简单的猜测一下,你给出的代码和 `while(true) sleep(1)` 没有本质的区别,sleep 之后线程挂起,不再占用 CPU 资源,时间到了之后由操作系统通过信号唤醒。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/622020

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX