在这种情况下,我将使用两个线程。主线程编写问题,等待答案,并保持得分。子线程可能会通过读取标准输入,并将答案发送到主线程
BlockingQueue。
通过使用
poll()阻塞队列中的方法,主线程可以等待五秒钟以获得答案:
…BlockingQueue<Integer> answers = new SynchronousQueue();Thread t = new ReaderThread(answers);t.start();for (int i = 0; i < numQuestions; ++i) { questions.askQuestion(i); System.out.print("Your answer (number): "); Integer answer = answers.poll(5, TimeUnit.SECONDS); playerIsRight = (answer != null) && questions.checkAnswer(i, answer - 1); …}t.interrupt();如果此调用返回
null,则主线程知道子线程在这段时间内未收到任何输入,并且可以适当地更新分数并打印下一个问题。
该
ReaderThread会是这个样子:
class ReaderThread extends Thread { private final BlockingQueue<Integer> answers; ReaderThread(BlockingQueue<Integer> answers) { this.answers = answers; } @Override public void run() { Scanner in = new Scanner(System.in); while (!Thread.interrupted()) answers.add(in.nextInt()); }}在上使用时
System.in,
Scanner将一直阻塞,直到用户按下为止
Enter,因此
Enter当主线程超时并移至下一个问题时,用户可能输入了一些文本但尚未按下该文本。用户将不得不删除他们的待处理条目,并为新问题输入新答案。我不知道如何解决这种尴尬,因为没有可靠的方法来打断
nextInt()电话。



