当前位置: 首页 > 面试题库 >

使用Java的Runtime.exec()时如何添加超时值?

陆伟
2023-03-14
问题内容

我有一种用于在本地主机上执行命令的方法。我想向该方法添加一个超时参数,以便如果被调用的命令没有在合理的时间内完成,则该方法将返回错误代码。这是到目前为止的样子,无法超时:

public static int executeCommandLine(final String commandLine,
                                     final boolean printOutput,
                                     final boolean printError)
    throws IOException, InterruptedException
{
    Runtime runtime = Runtime.getRuntime();
    Process process = runtime.exec(commandLine);

    if (printOutput)
    {
        BufferedReader outputReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        System.out.println("Output:  " + outputReader.readLine());
    }

    if (printError)
    {
        BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
        System.out.println("Error:  " + errorReader.readLine());
    }

    return process.waitFor();
}

谁能为我提出一种实现超时参数的好方法?


问题答案:
public static int executeCommandLine(final String commandLine,
                                     final boolean printOutput,
                                     final boolean printError,
                                     final long timeout)
      throws IOException, InterruptedException, TimeoutException {
  Runtime runtime = Runtime.getRuntime();
  Process process = runtime.exec(commandLine);
  /* Set up process I/O. */
  ... 
  Worker worker = new Worker(process);
  worker.start();
  try {
    worker.join(timeout);
    if (worker.exit != null)
      return worker.exit;
    else
      throw new TimeoutException();
  } catch(InterruptedException ex) {
    worker.interrupt();
    Thread.currentThread().interrupt();
    throw ex;
  } finally {
    process.destroyForcibly();
  }
}

private static class Worker extends Thread {
  private final Process process;
  private Integer exit;
  private Worker(Process process) {
    this.process = process;
  }
  public void run() {
    try { 
      exit = process.waitFor();
    } catch (InterruptedException ignore) {
      return;
    }
  }  
}


 类似资料:
  • 问题内容: 使用自由样式项目时,您可以设置20分钟后,如果未结束,则构建将中止。Jenkins多分支管道项目如何做到这一点? 问题答案: 您可以使用超时步骤: 如果你需要一个不同的比 MINUTES ,您可以提供的参数: 编辑2018年8月: 如今,使用更常见的声明性管道(易于被顶层构造识别),也可以在不同级别(每个整体管道或每个阶段)使用指定超时: 尽管如此,如果您想将超时应用于声明式管道中的单

  • 当您使用自由风格项目时,您可以设置在20分钟后,如果未结束,则中止生成。Jenkins多分支管道项目如何实现这一点?

  • 问题内容: 想在一个固定的时间内运行一个线程。如果未在该时间内完成,我想杀死它,抛出一些异常或以某种方式处理它。怎么做到呢? 我从该线程 了解到的一种方法是在该线程的run()方法内使用TimerTask。 有没有更好的解决方案呢? 编辑:添加赏金,因为我需要一个更明确的答案。下面给出的ExecutorService代码无法解决我的问题。为什么在执行完某些代码后就进入sleep()-我无法处理这段

  • 我正在使用PhpStorm,对于函数,我想在评论部分添加< code>@since 1.0.0。像这样: PhpStorm文档中没有说明如何实现这一点。 < li >有没有人使用过PhpStorm,并让< code>@since在做自动注释时显示出来? < li >这可以自动化吗? < li >我应该在PhpStorm的什么地方指定一个版本号来跟踪它?

  • 问题内容: 过去,已经进行了许多尝试以在Python中添加超时功能,以便在指定的时间限制到期时,等待的代码可以继续运行。不幸的是,以前的配方要么允许正在运行的功能继续运行并消耗资源,要么使用特定于平台的线程终止方法终止该功能。该Wiki的目的是针对这个问题开发跨平台的答案,许多程序员必须针对各种编程项目解决该问题。 编辑: 这段代码是为Python 3.x编写的,并非为装饰类方法而设计。该模块并非

  • 问题内容: 我无法为Java时间戳添加秒数。 我有这个,但是,它给了我相同的日期: 问题答案: 您拥有的代码适合我。作为简短但完整的程序: 输出: 请注意相差10分钟,即600秒。 当然,这样会损失亚毫秒级的精度,这可能不太理想-最初与我通常使用的时间戳背道而驰-但这 确实 增加了秒数… 另一种选择是直接使用: