因此,我正在研究一個從命令行起作用的測驗計劃,並且測驗有時間限制。我想要做的就是當用戶的時間到了,即使他們正在回答問題的時候,也可以停止測驗。我正在使用Java的Scanner來獲取用戶的輸入,所以我想實質上告訴Scanner對象終止,即使它處於接受輸入的中間位置。如何阻止Java掃描器接受輸入
現在,我知道我可以在事後追溯懲罰用戶,但我只是希望測驗在超過時限後終止。有沒有辦法用多線程來做這個例子?
因此,我正在研究一個從命令行起作用的測驗計劃,並且測驗有時間限制。我想要做的就是當用戶的時間到了,即使他們正在回答問題的時候,也可以停止測驗。我正在使用Java的Scanner來獲取用戶的輸入,所以我想實質上告訴Scanner對象終止,即使它處於接受輸入的中間位置。如何阻止Java掃描器接受輸入
現在,我知道我可以在事後追溯懲罰用戶,但我只是希望測驗在超過時限後終止。有沒有辦法用多線程來做這個例子?
Java掃描程序正在使用阻止操作。不可能阻止它。甚至不使用Thread.interrupt();
但是,您可以使用BufferedLineReader
進行閱讀並能夠停止該線程。這不是一個簡潔的解決方案,因爲它涉及到短時間暫停(否則它會使用100%的CPU),但它確實有效。
public static class ConsoleInputReadTask {
private final AtomicBoolean stop = new AtomicBoolean();
public void stop() {
stop.set(true);
}
public String requestInput() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("ConsoleInputReadTask run() called.");
String input;
do {
System.out.println("Please type something: ");
try {
// wait until we have data to complete a readLine()
while (!br.ready() && !stop.get()) {
Thread.sleep(200);
}
input = br.readLine();
} catch (InterruptedException e) {
System.out.println("ConsoleInputReadTask() cancelled");
return null;
}
} while ("".equals(input));
System.out.println("Thank You for providing input!");
return input;
}
}
public static void main(String[] args) {
final Thread scannerThread = new Thread(new Runnable() {
@Override
public void run() {
try {
String string = new ConsoleInputReadTask().requestInput();
System.out.println("Input: " + string);
}
catch (IOException e) {
throw new RuntimeException(e);
}
}
});
scannerThread.start();
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
scannerThread.interrupt();
}
}).start();
}
一旦主線程中斷,我可以繼續完成測驗分數並將其顯示給用戶嗎?你能在代碼中顯示嗎?謝謝。 – dramzy 2015-01-31 20:23:25
@RespectMyAuthoritah你看看這是怎麼回事。殺死線程做一個線程的輸入,該線程什麼都不做,只是等待超時過期:這個程序在哪裏繼續?這確實有點「太寬泛」,因爲你必須仔細思考一系列的設計決定......(不,我沒有投票結束。) – laune 2015-01-31 20:29:50
好吧,我希望它繼續與主要線程的工作流程。這不可能嗎?我並不是要求如何設計我的程序,而是簡單地如何停止掃描儀並繼續執行程序的其餘部分。 – dramzy 2015-01-31 20:31:52
反思您的問題:您是否希望掃描儀停止輸入,或者您是否希望在時間限制過後停止使用從掃描儀獲得的任何輸入?提示:每次輸入時請檢查您的時間限制。 – MarsAtomic 2015-01-31 20:16:19
我在問題中提到了這一點。我不想在每次獲得答案時檢查用戶是否超出了時間限制,我需要一種當用戶超出時間限制時停止測驗的方式。 – dramzy 2015-01-31 20:18:43