Java Android ping IOException启动进程时“打开的文件太多”

时间:2015-12-31 21:38:31

标签: java android multithreading process ping

我正在创建一个Android应用程序,可以ping网络中的许多主机......

要做到这一点,我在/ system / bin / ping使用ping命令。显然,这给了我一个IOException“打开太多文件”。我认为这是因为我没有正确地关闭一些东西而且正在用它来掩盖资源。我尝试关闭输入流,但这没有帮助。

当我经常多次开始使用pingHost()时会发生这种情况...我按下了一个按钮来启动和取消网络扫描。每个ping都在一个单独的线程上运行,并在按下按钮时停止,以阻止它们将布尔“runnable”变量设置为false。如果按下此按钮几次,它会变慢。这不酷。洛尔

我一直在愚弄这个程序试图找出我忘记关闭的内容,但一直没有成功。

我已经尝试过proc.destroy()但是它无法破坏这个过程。我假设这也会引发返回proc的exitValue()的问题。可能有一个我不理解的简单解决方案。有一段时间我一直在玩弄这个没有运气的人。如果可能的话,我想要一些帮助! :)

public static int pingHost(String host) throws IOException, InterruptedException {
    String cmd = "/system/bin/ping -c 1 -W 1000 " + host;
    Process proc = Runtime.getRuntime().exec(cmd);
    BufferedReader input = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
    String line;
    while ((line = input.readLine()) != null) {
        System.out.println(line);
    }
    proc.waitFor();

    input.close();
    return proc.exitValue();
}
  

java.lang.ProcessManager.exec中的Blockquote(ProcessManager.java:211)   12-31 16:24:07.306 13243-15816 / sage.networktools W / System.err:at java.lang.Runtime.exec(Runtime.java:168)   12-31 16:24:07.306 13243-15816 / sage.networktools W / System.err:at java.lang.Runtime.exec(Runtime.java:241)   12-31 16:24:07.306 13243-15816 / sage.networktools W / System.err:at java.lang.Runtime.exec(Runtime.java:184)   12-31 16:24:07.306 13243-15816 / sage.networktools W / System.err:at sage.networktools.MainActivity。 pingHost(MainActivity.java:98)   12-31 16:24:07.316 13243-15791 / sage.networktools W / System.err:at java.lang.Runtime.exec(Runtime.java:184)   12-31 16:24:07.316 13243-15791 / sage.networktools W / System.err:at sage.networktools.MainActivity.pingHost(MainActivity.java:98)   12-31 16:24:07.316 13243-15791 / sage.networktools W / System.err:at sage.networktools.MainActivity $ 2.run(MainActivity.java:189)   12-31 16:24:07.316 13243-15791 / sage.networktools W / System.err:at java.lang.Thread.run(Thread.java:856)   12-31 16:24:07.316 13243-15791 / sage.networktools W / System.err:引起: java.io.IOException:打开文件太多   12-31 16:24:07.316 13243-15791 / sage.networktools W / System.err:at java.lang.ProcessManager.exec(Native Method)   12-31 16:24:07.316 13243-15791 / sage.networktools W / System.err:at java.lang.ProcessManager.exec(ProcessManager.java:209)

2 个答案:

答案 0 :(得分:0)

我发现了一个非常烦人的解决方案。如果有更清洁的解决方案,请告诉我。

我将创建的每个线程添加到ArrayList。单击停止按钮时,我会中断列表中的每个线程。

仍然不是我希望的那种解决方案......但至少它有效。

答案 1 :(得分:0)

在您的案例中似乎没有被破坏,您可以在process.destroy()之后尝试使用process.waitFor()