标签: infinite-loop

java.io.FileInputStream.readBytes(本机方法)的无限100%CPU使用率

我现在正在调试一个程序,每个外部进程有两个线程,这两个线程继续使用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)

java jvm cpu-usage infinite-loop

24
推荐指数
1
解决办法
5121
查看次数

如何中断无限循环

虽然我知道要问一点有点傻,但我还是想更多地询问它的技术观点.

无限循环的一个简单示例:

public class LoopInfinite {
    public static void main(String[] args) {
        for (;;) {
            System.out.println("Stack Overflow");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如何从这个类的外部中断(停止)这个无限循环(例如,在继承的帮助下)?

java loops infinite-loop

24
推荐指数
4
解决办法
1万
查看次数

"while 1"和"while True"之间有什么区别?

我已经看到了两种在Python中创建无限循环的方法:

  1. while 1:
        do_something()
    
    Run Code Online (Sandbox Code Playgroud)
  2. while True:
        do_something()
    
    Run Code Online (Sandbox Code Playgroud)

这些之间有什么区别吗?比另一个更pythonic?

python infinite-loop while-loop

23
推荐指数
3
解决办法
3万
查看次数

如何声明i和j使其成为无限循环?

while( i <= j && i >= j && i != j) {}
Run Code Online (Sandbox Code Playgroud)

如何声明i和j使其成为无限循环?

//这是我遇到的面试问题.

它问的是i和j的声明是什么,让它永远是真的.

我不能通过将i和j声明为数字类型来实现.还有哪些类型可以满足它?

java infinite-loop

23
推荐指数
1
解决办法
1473
查看次数

找到<< loop >>发生的地方

如果我们得到一个<<loop>>,那就意味着Haskell设法检测到一个无限循环.有没有办法让ghc告诉我们这个循环发生在哪里?似乎Haskell应该在某个地方拥有这些信息.

debugging haskell infinite-loop

23
推荐指数
1
解决办法
897
查看次数

来回循环Python

我想创建一个无限循环,从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中,以便我没有在循环中写出两次相同的代码?

python loops for-loop infinite-loop

23
推荐指数
4
解决办法
2946
查看次数

在brainfuck程序中检测无限循环

我用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

22
推荐指数
4
解决办法
5731
查看次数

如何对一些输入运行到无限循环的方法进行单元测试?

这个问题刚刚出现在我的脑海里,我想在这里问这个问题.

这个案例是有意的,我只写了一个无限运行的循环.我该如何进行单元测试呢?

我问这个是因为,这种情况可能发生在代码中的任何地方.假设我的方法委托给其他几种方法,我想知道

  • 它是如何陷入无限循环的
  • 什么输入引起了它
  • 调用哪种方法(来自此方法)导致了这种情况

我没有为此编写代码.问题纯粹是出于知识,如果将来出现这种情况该怎么办.请回复.

tdd junit nunit unit-testing infinite-loop

22
推荐指数
3
解决办法
1万
查看次数

Python - 用于停止无限循环的键盘命令?

可能重复:
为什么我不能在python中处理KeyboardInterrupt?

我正在玩一些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环境.

python aptana command-line keyboard-shortcuts infinite-loop

21
推荐指数
1
解决办法
16万
查看次数

使用BufferedReader读取所有行

我想使用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)

你能告诉我我做错了什么吗?

java infinite-loop bufferedreader inputstreamreader

21
推荐指数
3
解决办法
6万
查看次数