我现在正在调试一个程序,每个外部进程有两个线程,这两个线程继续使用while ((i = in.read(buf, 0, buf.length)) >= 0)循环读取Process.getErrorStream()和Process.getInputStream().
有时,当外部进程因JVM崩溃而崩溃时(请参阅这些hs_err_pid.log文件),那些读取该外部进程的stdout/stderr的线程开始消耗100%的CPU并且永远不会退出.循环体没有被执行(我在那里添加了一个日志语句),所以无限循环似乎在本机方法中java.io.FileInputStream.readBytes.
我在Windows 7 64位(jdk1.6.0_30 64位,jdk1.7.0_03 64位)和Linux 2.6.18(jdk1.6.0_21 32位)上重现了这一点.有问题的代码在这里,就像这样使用.请参阅这些链接以获取完整代码 - 以下是有趣的内容:
private final byte[] buf = new byte[256];
private final InputStream in;
...
int i;
while ((i = this.in.read(this.buf, 0, this.buf.length)) >= 0) {
...
}
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪看起来像
"PIT Stream Monitor" daemon prio=6 tid=0x0000000008869800 nid=0x1f70 runnable [0x000000000d7ff000]
java.lang.Thread.State: RUNNABLE
at java.io.FileInputStream.readBytes(Native Method)
at java.io.FileInputStream.read(FileInputStream.java:220)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
- locked …Run Code Online (Sandbox Code Playgroud) 虽然我知道要问一点有点傻,但我还是想更多地询问它的技术观点.
无限循环的一个简单示例:
public class LoopInfinite {
public static void main(String[] args) {
for (;;) {
System.out.println("Stack Overflow");
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何从这个类的外部中断(停止)这个无限循环(例如,在继承的帮助下)?
我已经看到了两种在Python中创建无限循环的方法:
while 1:
do_something()
Run Code Online (Sandbox Code Playgroud)while True:
do_something()
Run Code Online (Sandbox Code Playgroud)这些之间有什么区别吗?比另一个更pythonic?
while( i <= j && i >= j && i != j) {}
Run Code Online (Sandbox Code Playgroud)
如何声明i和j使其成为无限循环?
//这是我遇到的面试问题.
它问的是i和j的声明是什么,让它永远是真的.
我不能通过将i和j声明为数字类型来实现.还有哪些类型可以满足它?
如果我们得到一个<<loop>>,那就意味着Haskell设法检测到一个无限循环.有没有办法让ghc告诉我们这个循环发生在哪里?似乎Haskell应该在某个地方拥有这些信息.
我想创建一个无限循环,从0到100向上计数到0到0(依此类推),只有在满足循环内的某些收敛标准时才会停止,所以基本上是这样的:
for i in range(0, infinity):
for j in range(0, 100, 1):
print(j) # (in my case 100 lines of code)
for j in range(100, 0, -1):
print(j) # (same 100 lines of code as above)
Run Code Online (Sandbox Code Playgroud)
有没有办法将两个for循环合并到一个j中,以便我没有在循环中写出两次相同的代码?
我用MATLAB脚本语言编写了一个简单的brainfuck解释器.它被随机的bf程序执行(作为遗传算法项目的一部分).我面临的问题是,程序在相当多的情况下都会出现无限循环,因此GA会陷入困境.
所以,我需要一种机制来检测无限循环并避免在bf中执行该代码.
一个明显的(微不足道的)案例是我有的时候
[]
Run Code Online (Sandbox Code Playgroud)
我可以检测到这一点并拒绝运行该程序.
对于非平凡的情况,我发现基本思想是:确定循环的一次迭代如何改变当前单元格.如果变化为负,我们最终将达到0,所以这是一个有限的循环.否则,如果更改是非负的,则它是无限循环.
对于单个循环来说,实现这一点很容易,但是使用嵌套循环会变得非常复杂.例如,(在下面的(1)中指的是单元格1的内容等)
++++ Put 4 in 1st cell (1)
>+++ Put 3 in (2)
<[ While( (1) is non zero)
-- Decrease (1) by 2
>[ While( (2) is non zero)
- Decrement (2)
<+ Increment (1)
>]
(2) would be 0 at this point
+++ Increase (2) by 3 making (2) = 3
<] (1) was decreased by 2 and then increased by 3, so net effect is increment
Run Code Online (Sandbox Code Playgroud)
因此代码会一直运行.然而,对单元格1上的+和 - 的完成次数的天真检查会说-s的数量更多,因此不会检测到无限循环. …
algorithm interpreter infinite-loop halting-problem brainfuck
这个问题刚刚出现在我的脑海里,我想在这里问这个问题.
这个案例是有意的,我只写了一个无限运行的循环.我该如何进行单元测试呢?
我问这个是因为,这种情况可能发生在代码中的任何地方.假设我的方法委托给其他几种方法,我想知道
我没有为此编写代码.问题纯粹是出于知识,如果将来出现这种情况该怎么办.请回复.
我正在玩一些Python代码并创建了一个无限循环:
y = 0
x = -4
itersLeft = x
while(itersLeft<0):
y = y + x
itersLeft = itersLeft - 1
print "y = ",y, "itersLeft = ", itersLeft
print y
Run Code Online (Sandbox Code Playgroud)
是否有键盘快捷键可以让我停止循环 - 允许我修复循环然后重新启动它?
我试过Ctrl+ C并没有任何运气.如果它有助于我使用Windows 7环境.
谢谢.
编辑
我还应该提到我正在使用Aptana Studio 3并试图在其中运行Ctrl+ C命令.它在那里不起作用 - 但在常规控制台中尝试它可以正常工作.我假设它必须是因为Aptana环境.
我想使用BufferedReader在控制台中输入多行文本,当我点击"Enter"以查找整个文本长度的总和时.问题是,我似乎进入了一个无限循环,当我按下"Enter"时,程序没有结束.我的代码如下:
InputStreamReader instream = new InputStreamReader(System.in);
BufferedReader buffer = new BufferedReader(instream);
line= buffer.readLine();
while (line!=null){
length = length + line.length();
line= buffer.readLine();
}
Run Code Online (Sandbox Code Playgroud)
你能告诉我我做错了什么吗?
infinite-loop ×10
java ×4
python ×3
loops ×2
algorithm ×1
aptana ×1
brainfuck ×1
command-line ×1
cpu-usage ×1
debugging ×1
for-loop ×1
haskell ×1
interpreter ×1
junit ×1
jvm ×1
nunit ×1
tdd ×1
unit-testing ×1
while-loop ×1