2012-04-07 62 views
6

是否可以爲用戶輸入設置計時器?等待10秒鐘 - 下一操作等 我的意思是比如用戶輸入設置超時

//wait several seconds{ 
String s = new BufferedReader(new InputStreamReader(System.in)).readLine(); 
//wait server seconds} 
//next operation and etc. 

回答

4

不開箱的,沒有。通常,只有當另一個線程關閉底層流時,Reader纔會跳出read()調用,或者您到達輸入的末尾。

由於read()並非都是可以中斷的,所以這成爲一個併發編程問題。知道超時的線程需要能夠中斷試圖讀取輸入的線程。

從本質上講,閱讀線程將不得不輪詢閱讀器的ready()方法,而不是在沒有任何內容需要讀取時鎖定在read()中。如果你在java.util.concurrent.Future中封裝這個輪詢和等待操作,那麼你可以使用timeout來調用Future的get()方法。

本文進入一些細節:http://www.javaspecialists.eu/archive/Issue153.html

12

稍微更簡單的方式來做到這一點比本傑明·考克斯的答案會是做這樣的事情

int x = 2; // wait 2 seconds at most 

BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
long startTime = System.currentTimeMillis(); 
while ((System.currentTimeMillis() - startTime) < x * 1000 
     && !in.ready()) { 
} 

if (in.ready()) { 
    System.out.println("You entered: " + in.readLine()); 
} else { 
    System.out.println("You did not enter data"); 
} 

然而這將消耗更多的資源比他的解決方案。

+2

如果有任何字節可用,BufferedReader.ready()似乎返回true,不一定包含換行符。考慮有一個角色在等待而沒有結尾的新行的情況。 in.ready()返回true,調用in.readLine(),但會無限期地等待換行符。 – pendor 2014-02-19 15:14:57

+1

@pendor但是隻有當用戶輸入提供換行符序列的命令行時,標準的'System.in'纔會有數據。 – Jeffrey 2014-02-19 19:03:02

+1

@Jeffrey是否在任何地方記錄? – Max 2016-03-05 17:32:10