是否可以爲用戶輸入設置計時器?等待10秒鐘 - 下一操作等 我的意思是比如用戶輸入設置超時
//wait several seconds{
String s = new BufferedReader(new InputStreamReader(System.in)).readLine();
//wait server seconds}
//next operation and etc.
是否可以爲用戶輸入設置計時器?等待10秒鐘 - 下一操作等 我的意思是比如用戶輸入設置超時
//wait several seconds{
String s = new BufferedReader(new InputStreamReader(System.in)).readLine();
//wait server seconds}
//next operation and etc.
不開箱的,沒有。通常,只有當另一個線程關閉底層流時,Reader纔會跳出read()調用,或者您到達輸入的末尾。
由於read()並非都是可以中斷的,所以這成爲一個併發編程問題。知道超時的線程需要能夠中斷試圖讀取輸入的線程。
從本質上講,閱讀線程將不得不輪詢閱讀器的ready()方法,而不是在沒有任何內容需要讀取時鎖定在read()中。如果你在java.util.concurrent.Future中封裝這個輪詢和等待操作,那麼你可以使用timeout來調用Future的get()方法。
本文進入一些細節:http://www.javaspecialists.eu/archive/Issue153.html
稍微更簡單的方式來做到這一點比本傑明·考克斯的答案會是做這樣的事情
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");
}
然而這將消耗更多的資源比他的解決方案。
如果有任何字節可用,BufferedReader.ready()似乎返回true,不一定包含換行符。考慮有一個角色在等待而沒有結尾的新行的情況。 in.ready()返回true,調用in.readLine(),但會無限期地等待換行符。 – pendor 2014-02-19 15:14:57
@pendor但是隻有當用戶輸入提供換行符序列的命令行時,標準的'System.in'纔會有數據。 – Jeffrey 2014-02-19 19:03:02
@Jeffrey是否在任何地方記錄? – Max 2016-03-05 17:32:10