【问题标题】:Killing an infinite loop freezes the terminal杀死一个无限循环会冻结终端
【发布时间】:2016-03-14 23:26:12
【问题描述】:

已经在 SO 上发布了 similar question,但是,该解决方案仅在循环不生成任何输出时才有效。 相反,如果我尝试运行while(true) System.out.print(1); 并在之后点击 Ctrl+C ,那么终端会冻结,似乎无法杀死它。 除了关闭和重新打开终端,还有什么可以做的吗?

【问题讨论】:

  • 好问题。奇怪的是,当尝试打印“Hello”时,有时使用 CTRL+C 确实会终止循环,有时则不会。
  • 在另一个终端你可以杀死-9进程。
  • 既然问题已经过时了。然而,在最新版本 9.0.1 jshell Ctrl+C 上尝试同样的方法对我有用。

标签: java java-9 jshell


【解决方案1】:

你不应该有这样的循环。您应该通过让活动线程休眠一段时间来释放 CPU 一些时间

while (true) {
    // Do your processing stuff here.

    // This line ensures that the active thread releases some time
    // to the CPU, allowing closure of the application via Ctrl-C.
    Thread.sleep(numberOfMillisecondsToSleepFor);
}

您可以使用现有代码从另一个终端使用 kill 终止该进程,但您确实应该通过正确编码循环来应对这种情况,从而防止出现这种 CPU 锁定情况。

【讨论】:

  • 这并不能真正回答问题。有一个空循环不会导致同样的事情。
  • 那么空的无限循环和带有打印语句的无限循环有什么区别(从CPU使用率来看)?
  • 这就是我要说的......如果你在 JShell 中编写一个空循环,你可以终止它(只有循环,而不是 JShell 进程 - 没有任何sleep 那里的方法)使用 CTRL + C。对我来说,为什么在其中包含 print 语句会改变这种行为是没有意义的。
  • 你没有明白我的意思。我非常知道代码没用。我试图理解为什么有一个空的无限循环与有一个带有指令的无限循环不同,就JShell而言。它确实允许终止一个空的无限循环,但不能终止其中包含语句的循环。
  • 这确实回答了这个问题。事实上,创建 jshell 是为了测试 Java 代码。仅通过测试某些循环结构就很可能创建无限循环。在这种情况下,您可能希望在jshell 中有一个选项来中断执行。这不是编写可以停止的循环的最佳方法。 当然不是要求的。
猜你喜欢
  • 2011-03-30
  • 2013-08-04
  • 2016-10-26
  • 1970-01-01
  • 2021-01-05
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
  • 1970-01-01
相关资源
最近更新 更多