从stdin读取但无法知道何时停止

时间:2015-06-25 09:38:29

标签: java events stdin

我在commmand提示符下运行一些commnads。我正在等待最后一个命令的输出完成。我必须读取输出并执行操作。我的命令输出非常动态,我无法预测何时可以停止阅读。

我遇到的问题我不知道何时停止阅读。如果假设我保持while read(),那么我的上一个命令输出不会以新行结束。是否有任何机制可以告诉我,如果过去5分钟没有关于stdin的活动,那么我会得到一些警告?

1 个答案:

答案 0 :(得分:0)

我采用的方法是创建一个实现Runnable的类,它监视共享AtomicInteger标志的值。此InputRunnable类休眠5分​​钟(300000毫秒),然后唤醒以检查该值是否已由main方法设置。如果用户在最近5分钟内输入了至少一个输入,则该标志将设置为1,InputRunnable将继续执行。如果用户在最近5分钟内输入了输入,则该线程将调用System.exit(),这将终止整个应用程序。

public class InputRunnable implements Runnable {
    private AtomicInteger count;

    public InputRunnable(AtomicInteger count) {
        this.count = count;
    }

    public void run() {
        do {
            try {
                Thread.sleep(300000);               // sleep for 5 minutes
            } catch (InterruptedException e) {
                // log error
            }

            if (count.decrementAndGet() < 0) {      // check if user input occurred
                System.exit(0);                     // if not kill application
            }
        } while(true);
    }
}

public class MainThreadClass {
    public static void main(String args[]) {
        AtomicInteger count = new AtomicInteger(0);
        InputRunnable inputRunnable = new InputRunnable(count);
        Thread t = new Thread(inputRunnable);
        t.start();

        while (true) {
            System.out.println("Enter a number:");
            Scanner in = new Scanner(System.in);
            int num = in.nextInt();                 // scan for user input

            count.set(1);
        }
    }
}

我在本地测试了这段代码并且它似乎正在运行,但如果您在系统上运行它有任何问题,请告诉我。