Я пишу систему тестирования, и я все, что я хочу сделать, это подсчитать, сколько секунд пользователь потратил на этот вопрос. то есть i напечатать вопрос (стандартный System.out.println), а затем подождать 5 секунд, и если в течение этих 5 секунд пользователь ответил (через стандартный ввод), я хочу сохранить это значение. Если пользователь не предоставил ответ в течение 5 секунд, он должен пропустить этот вопрос и продолжить. Проблема заключается в том, что im читает пользовательские ответы через объект Scanner, и что-то вроде in.nextInt() неконтролируемо, я полагаю.Получить ввод в определенное время
Как я могу решить эту проблему? Вот фрагмент моего кода без этой функциональности, можете ли вы дать мне несколько советов, что добавить?
public void start() {
questions.prepareQuestions(numQuestions);
Scanner in=new Scanner(System.in);
boolean playerIsRight=false,botIsRight=false;
int playerScore=0,botScore=0;
for (int i = 0; i < numQuestions; i++) {
questions.askQuestion(i);
System.out.print("Your answer(number): ");
playerIsRight=questions.checkAnswer(i,in.nextInt()-1); //in.nextInt() contains the answer
botIsRight=botAnswersCorrectly(i + 1);
if(playerIsRight){ playerScore++; System.out.println("Correct!");}
else System.out.println("Incorrect!");
if(botIsRight) botScore++;
System.out.print("\n");
}
if(botScore>playerScore) System.out.println("Machine won! Hail to the almighty transistors!");
else if(playerScore>botScore) System.out.println("Human won! Hail to the power of nature!");
else System.out.println("Tie. No one ever wins. No one finally loses.");
}
Это может быть хромой, но что, если я начну новый поток после вопроса, вызовет wait (timeout), и в новом потоке я буду ждать ответа и после его получения я вызову notify() для объекта в родительский поток. Это будет работать? – Anton
Я только что проверил - его не работает :) – Anton
Вы можете опрокинуть свое собственное решение, используя 'wait' и' notify', но, как вы видели, это сложно сделать правильно. Использование «BlockingQueue» примерно эквивалентно, но оно поставляется в чистом, надежном пакете. – erickson