【问题标题】:java multithreading using Process.waitFor() and java.lang.InterruptedException使用 Process.waitFor() 和 java.lang.InterruptedException 的 java 多线程
【发布时间】:2012-02-17 17:51:03
【问题描述】:

这是我一直在做的伪代码:

ProcessBuilder processBuilder = new ProcessBuilder(cmdToExecute);
    Process process = processBuilder.start();
    StreamGobbler errorGobbler = new StreamGobbler(process.getErrorStream(), "ERROR");
    StreamGobbler outStreamGobbler = new StreamGobbler(process.getInputStream(), "OUTPUT");

    errorGobbler.start();
    outStreamGobbler.start();
    int exitValue = process.waitFor();
    process.destroy();

我在使用时遇到了 InterruptedException

Process.waitFor()

命令。当它是一个单线程的 java 应用程序时很好。但 现在它是一个多线程应用程序,我得到了

java.lang.InterruptedException

在那条线上。 Java 文档说:

抛出:InterruptedException - 如果当前线程被中断 由另一个线程在等待时,然后等待结束并且 抛出 InterruptedException

我明白这意味着什么,因为 1 个线程可能正在等待,而另一个线程也想等待,但我如何克服这个异常,并且我将能够使用 waitFor()。

感谢任何帮助。我觉得没有必要发布代码,但如果你们需要,请告诉我。

ExecutorService 的代码:

while(...){
                          .......
        execServ.execute(...);
    }
    execServ.shutdown();
            while(!execServ.isTerminated()){
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
                }

【问题讨论】:

  • "1 个线程可能正在等待,而另一个线程也想等待"。不,那还不是。这意味着其他一些线程中断了wait() 调用。
  • 感谢 Gray 纠正我,我应该怎么做才能消除这个错误?

标签: java multithreading interrupted-exception


【解决方案1】:

我不确定您是否理解 Javadoc 的含义。这就是说,如果其他线程在执行您在调用waitFor() 之前或期间发布的代码的线程上调用interrupt(),则会抛出InterruptedException。它与两个线程同时等待某事无关。

您的程序是否在任何地方显式调用interrupt()?或者,您是否通过ExecutorService 执行此过程?当你取消一个已经提交给执行者的任务时,它可能会被中断。

【讨论】:

  • 我已经为 ExecutorSAervice 添加了代码。请给它一些亮点吗?
  • @user122591 看起来不错。您正在调用shutdown(),而不是shutdownNow(),因此不应中断正在运行的任务。你在任何地方都给interrupt()打电话吗?其他线程是否可以访问您的ExecutorService
  • 我有 6 个线程同时运行。而且我无法弄清楚为什么以及谁在调用中断()?有没有办法找到谁/为什么打电话中断?我没有在任何地方调用中断。谢谢
  • 调用中断的一种方法是检索对应于可运行任务的未来:Future<?> future = pool.submit(task); 并取消这个未来:future.cancel();
猜你喜欢
  • 2011-01-10
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多