while(true);为啥有些语言会卡死 有些不会?\n?
只接触过VB、C,题主问的是界面卡死,我就说说卡死的原因:Windows采用消息机制,每个窗体有一个消息线程,用于响应用户事件(鼠标、键盘等),也就是一个消息队列。对于VB来说,是面向事件编程的,在一个事件里使用While True相当于把消息线程阻塞了,后面的消息一直卡在消息队列里,卡到一定程度,就界面就停止响应了。同样的,用C也可以卡死界面,道理是一样的,消息队列满了。VB里有一个技巧,就是在while true里插入一行doevents,相当于释放一下CPU让消息线程继续跑一跑,这样就不会卡死了。这个技巧在C#里是Application.DoEvents(),用C实现应该是类似DispatchMessage之类的(很久没写了记不太清楚)。Java和AS不了解原理,不好判断,但如果Java的事件处理如果不是单线程的,那么其中一个卡死则不会影响其余消息的处理。这里还有一个技巧,有些病毒或者恶意软件会卡死整个系统,方法就是在系统层面上挂消息钩子,钩子里多做点事情就足够卡死整个系统了。
■网友
vb编译出来的死循环不再响应任何事件,所以系统提示你他没有响应。java编译出来的东西响应系统事件是靠jvm传递,理论上讲他是响应了系统事件,但是你的程序没有处理而已。其实这都不算崩,你点忽略他都还在继续跑。
■网友
vb、as3的主界面的刷新取决于程序,程序死循环了,界面就没机会被刷新,自然就是卡死了。java是控制台,真正的程序由jvm进程执行,控制台的界面是cmd.exe的,也不需要java程序来刷新。其实java程序是不会有任何处理机会了。
■网友
我这个小白用户也答一下。@北极 已经回答了相当一部分。其实这和操作语言关系不大,个人认为,这涉及到了操作系统内核的任务调度。死循环容易不让出cpu,所以,在多任务的执行环境中总是让cpu空闲不下来。可能操作系统以为这是一个大运算量的计算任务,其他的任务在调度时受了了实时性减弱的影响。可以在编程中尽量避免这种死循环。可以sleep一会,或者调用了一些引起IO阻塞的系统调用,或者主动让出处理器,让调度器调度下一个已经准备好的任务。
推荐阅读
- 为啥看到书柜上的藏书会有心旷神怡的感觉
- 为啥知乎上普便有一种【我在北上广深打工,所以拥有更好的视野】这样的错觉
- 为啥工商银行的用户体验如此之差
- 汽车|看了中消协4S店服务测评调查结果,终于知道法系车为啥卖不好了
- 你为啥从窝窝商城离职?
- 为啥5G和2.4G默认的BSSID是相同的
- 为啥电器实体店的价格比淘宝贵那么多
- 现在在线学习视频有很多了,为啥大部分人还是喜欢下载下来观看
- 为啥到现在你还没有女朋友 ?
- 天赐的声音|33岁张雨绮为啥总离婚?看过这些照片就明白了,都是性感惹得祸