Ich schreibe ein Testsystem und ich möchte nur zählen, wie viele Sekunden der Benutzer für diese Frage ausgegeben hat. d. h. ich drucke die Frage (Standard System.out.println), warte dann 5 Sekunden und wenn innerhalb dieser 5 Sekunden der Benutzer antwortet (über die Standardeingabe), möchte ich diesen Wert behalten. Wenn der Benutzer innerhalb von 5 Sekunden keine Antwort erhalten hat, muss er diese Frage überspringen und fortfahren. Das Problem ist - ich lese Benutzerantworten über Scanner-Objekt, und etwas wie in.nextInt() ist unkontrollierbar, nehme ich an.Empfange Eingang in bestimmter Zeit
Wie kann ich dieses Problem lösen? Hier ist ein Fragment meines Codes ohne diese Funktionalität. Kannst du mir einige Hinweise geben, was ich hinzufügen soll?
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.");
}
Es kann lahm sein, aber was ist, wenn ich einen neuen Thread nach dem Stellen einer Frage, Anruf warten (Timeout) und in neuen Thread ich werde auf die Antwort warten und nach dem Empfang, ich werde notify() auf Objekt in aufrufen Elternteil-Thread Wird es funktionieren? – Anton
Ich habe gerade überprüft - es funktioniert nicht :) – Anton
Sie könnten Ihre eigene Lösung mit 'warten' und' notify' rollen, aber wie Sie gesehen haben, ist es schwierig, es richtig zu machen. Die Verwendung einer 'BlockingQueue' ist ungefähr gleichwertig, aber sie ist in einem sauberen, zuverlässigen Paket enthalten. – erickson