如果没有输入任何内容,如何检查Scanner.hasNext(System.in)超时?

时间:2014-10-03 02:07:29

标签: java multithreading java.util.scanner blocking

Scanner sc = new Scanner(System.in);

扫描仪可用于读取文本文件,用户输入流等。我专门用它来阅读用户输入,如上所述。

使用我上面制作的扫描仪,因为它可以使用#& System.in,当没有下一个输入时调用其hasNext()将导致相关线程阻塞,直到它有下一个数据并返回true时。我想检查一下,getter风格,天气有下一个数据,不是,像hasNext()返回,天气下可能有数据。

其他问题通过启动一个等待hasNext()并解决了提问者问题的线程来解决这个问题。这对我的问题没有帮助。

一个有用的代码块是调用hasNext()的代码,如果它在10ms内没有得到答案,则返回false。

我已经阅读了这些规则并试图遵守这些规则,但我认为这是我的第一个问题之一,如果我做得不对,请唱出来。

提前致谢。

1 个答案:

答案 0 :(得分:1)

我认为生产者 - 消费者在这里没有错:

// Shared queue
final Queue<String> messages = new ConcurrentLinkedQueue<>();

// Non-blocking consumer
ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();
ses.scheduleAtFixedRate(new Runnable(){
    @Override
    public void run() {
        // non-blocking
        while((String message = messages.poll()) != null) {
            // do something
        }
    }
}, 0, 10, TimeUnit.MILLISECONDS);

// Blocking producer
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
    messages.add(sc.next());
}

然后,消费者可以在共享Queue上进行非阻止。只有生产者知道,一旦读取新消息,它就会被填充。