以编程方式从java中的用户输入发送命令的停止信号

时间:2014-11-13 13:27:01

标签: java command execution

我正在执行一个简单的命令,其中用户提供选项(args)并且我做了一个逻辑来获取Java程序中的args,其中我使用wait()特定时间,以便命令将花费最少的时间到执行。之后我将一些数据保存在文件中。

在这段时间内,如果用户想要结束流程,应该能够通过提供类似"退出"等输入来顺利停止流程。在命令提示符下。

请帮忙。

1 个答案:

答案 0 :(得分:1)

中断命令行程序的标准方法是在应用程序中添加Ctrl-C处理程序:

Runtime.getRuntime().addShutdownHook(new Thread() {
  public void run() { 
    // cleanup logic here
  }
});

有关详细信息,请参阅此question

既然你坚持了。这是在后台线程中执行命令时的实现。我希望这个例子的复杂性会阻止你实现它:

import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class Shell {
  private static final int NUM_PARALLEL_COMMANDS = 5;
  private static final int SLEEP_DURATION = 1000;

  public static void main(String[] args) throws InterruptedException {
    ExecutorService executor = 
        Executors.newFixedThreadPool(NUM_PARALLEL_COMMANDS);
    try (Scanner scanner = new Scanner(System.in)) {
      String command = null;     
      int counter = 0;
      do {
        command = scanner.nextLine();
        switch (command) {
          case "DoStuff":
            executor.submit(NewDoStuffCommand(++counter));
            break;
        }
      } while (!command.equals("exit"));
    }

    executor.shutdownNow();
    executor.awaitTermination(1, TimeUnit.SECONDS);
  }

  private static Runnable NewDoStuffCommand(final int counter) {
    return new Runnable() {
      @Override 
      public void run() {
        try {
          for (int i = 0; i < 10; i++) {
            System.out.println(counter + ": Doing time consuming things...");
            Thread.sleep(SLEEP_DURATION);
          }
          System.out.println(counter + ": Finished.");
        } catch (InterruptedException e) {
          System.out.println(counter + ": Command interrupted :(");
          // do cleanup
          Thread.currentThread().interrupt();
        }
      }
    };
  }
}