2015-01-31 73 views
1

因此,我正在研究一個從命令行起作用的測驗計劃,並且測驗有時間限制。我想要做的就是當用戶的時間到了,即使他們正在回答問題的時候,也可以停止測驗。我正在使用Java的Scanner來獲取用戶的輸入,所以我想實質上告訴Scanner對象終止,即使它處於接受輸入的中間位置。如何阻止Java掃描器接受輸入

現在,我知道我可以在事後追溯懲罰用戶,但我只是希望測驗在超過時限後終止。有沒有辦法用多線程來做這個例子?

+0

反思您的問題:您是否希望掃描儀停止輸入,或者您是否希望在時間限制過後停止使用從掃描儀獲得的任何輸入?提示:每次輸入時請檢查您的時間限制。 – MarsAtomic 2015-01-31 20:16:19

+0

我在問題中提到了這一點。我不想在每次獲得答案時檢查用戶是否超出了時間限制,我需要一種當用戶超出時間限制時停止測驗的方式。 – dramzy 2015-01-31 20:18:43

回答

6

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(); 
} 
+0

一旦主線程中斷,我可以繼續完成測驗分數並將其顯示給用戶嗎?你能在代碼中顯示嗎?謝謝。 – dramzy 2015-01-31 20:23:25

+0

@RespectMyAuthoritah你看看這是怎麼回事。殺死線程做一個線程的輸入,該線程什麼都不做,只是等待超時過期:這個程序在哪裏繼續?這確實有點「太寬泛」,因爲你必須仔細思考一系列的設計決定......(不,我沒有投票結束。) – laune 2015-01-31 20:29:50

+0

好吧,我希望它繼續與主要線程的工作流程。這不可能嗎?我並不是要求如何設計我的程序,而是簡單地如何停止掃描儀並繼續執行程序的其餘部分。 – dramzy 2015-01-31 20:31:52