ユーザーの入力にタイマーを設定することはできますか? 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.
ベンジャミンコックスの答えよりも少し簡単な方法は、次のようなことをすることです
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");
}
ただし、これは彼のソリューションよりも多くのリソースを消費します。
箱から出してすぐではありません。通常、Reader は、別のスレッドが基になるストリームを閉じたとき、または入力の最後に到達したときにのみ、read() 呼び出しから抜け出します。
read() はそれほど割り込み可能ではないため、これは並行プログラミングの問題のビットになります。タイムアウトを認識しているスレッドは、入力を読み取ろうとしているスレッドを中断できる必要があります。
基本的に、読み取りスレッドは、読み取るものが何もないときに read() でロックされるのではなく、Reader の ready() メソッドをポーリングする必要があります。このポーリングおよび待機操作を java.util.concurrent.Future でラップする場合は、タイムアウトを指定して Future の get() メソッドを呼び出します。
この記事では、詳細について説明します: http://www.javaspecialists.eu/archive/Issue153.html
BufferedReader inputInt = new BufferedReader(new InputStreamReader(System.in));
Robot enterKey = new Robot();
TimerTask task = new TimerTask() {
public void run() {
enterKey.keyPress(KeyEvent.VK_ENTER);
}
};
Timer timer = new Timer();
timer.schedule(task, 30 * 1000);
userInputanswer = inputInt.read();
timer.cancel();