Scanner sc = new Scanner(System.in);
扫描仪可用于读取文本文件,用户输入流等。我专门用它来阅读用户输入,如上所述。
使用我上面制作的扫描仪,因为它可以使用#& System.in,当没有下一个输入时调用其hasNext()将导致相关线程阻塞,直到它有下一个数据并返回true时。我想检查一下,getter风格,天气有下一个数据,不是,像hasNext()返回,天气下可能有数据。
其他问题通过启动一个等待hasNext()并解决了提问者问题的线程来解决这个问题。这对我的问题没有帮助。
一个有用的代码块是调用hasNext()的代码,如果它在10ms内没有得到答案,则返回false。
我已经阅读了这些规则并试图遵守这些规则,但我认为这是我的第一个问题之一,如果我做得不对,请唱出来。
提前致谢。
答案 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
上进行非阻止。只有生产者知道,一旦读取新消息,它就会被填充。