簡體   English   中英

在java中沒有任何代碼的情況下無限地運行while循環

[英]Running while loop infinitely without any code inside in java

假設我寫了一個無限寫循環,但里面沒有語句? 它會產生任何問題,如內存已滿等或 JVM 會在一段時間后停止響應?

你為什么要做這樣的事情?

要回答,它不會消耗無限內存,但 Cpu 使用可能會很痛苦,根本沒有任何指令。

至少,你應該幫助 CPU 搶占,允許線程讓出:

Thread.yield();

您可以在Java Api Javadoc 中閱讀:

向調度程序提示當前線程願意放棄其當前對處理器的使用。 調度程序可以隨意忽略此提示。

Yield 是一種啟發式嘗試,旨在改善線程之間的相對進展,否則會過度使用 CPU。 它的使用應與詳細的分析和基准測試相結合,以確保它確實具有預期的效果。

很少適合使用這種方法。 它對於調試或測試目的可能很有用,它可能有助於重現由於競爭條件引起的錯誤。 在設計並發控制結構(例如 java.util.concurrent.locks 包中的結構)時,它也可能很有用。

無限循環可能並且可能會導致 100% 的 CPU 核心利用率。 根據“寫循環”的含義,類似的技術稱為Busy Waiting 或 Spinning

作為一種時間延遲技術的自旋通常會產生不可預測甚至不一致的結果,除非實現代碼以確定處理器可以多快地執行“什么都不做”循環,或者循環代碼顯式檢查實時時鍾

您肯定會保持一個硬件線程忙碌。 它不會創建任何對象,因此內存不是一個直接的問題。

但是,上下文很重要。

  • 如果是高優先級線程,系統可能會變得無響應。 這是特定於實現的。 二十年前,我寫了一個無限循環,使 Windows NT 系統無響應。 (我認為這是一個 TCP 代理,只有在運行 CICS 的 IBM 3090 向 3270 終端發送一個空的保持活動幀時才會發生。好時光。)
  • 如果線程持有任何鎖,則不會被釋放。
  • 如果線程做了一些有用的事情,那么有用的事情就不會發生。 例如,如果您要在終結器中編寫循環(並且系統只有一個終結器線程),則不會有其他對象被終結,因此也不會被垃圾收集。 應用程序的行為可能很特別。 在終結器線程上運行隨機代碼總是很有趣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM