2012-04-07 8 views

答えて

4

ないために意味 次の操作を行うと、など - 10秒待ちます。通常、Readerは、別のスレッドが基になるストリームを閉じるか、入力の最後に到達したときにのみread()呼び出しを中断します。

read()はすべて割り込み可能ではないので、これは並行プログラミングの問題となります。タイムアウトを知っているスレッドは、入力を読み取ろうとしているスレッドを中断できなければなりません。

本質的に、読み込みスレッドは、何も読み込めないときにread()でロックされるのではなく、Readerのready()メソッドをポーリングする必要があります。このポーリングと待機操作をjava.util.concurrent.Futureでラップすると、Futureのget()メソッドがタイムアウトで呼び出されます。

この記事では、いくつかの詳細に入る:http://www.javaspecialists.eu/archive/Issue153.html

12

Aベンジャミン・コックスの答えよりも、これを行うには少し簡単な方法は、

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を返します。必ずしも改行を含む必要はありません。行末に改行なしで1文字待機する場合を考えてみましょう。 in.ready()はtrueを返し、in.readLine()は呼び出されますが、改行を無期限に待ってブロックします。 – pendor

+1

@pendorしかし、標準の 'System.in'は、改行シーケンスを提供するコマンドラインでユーザがEnterキーを押した場合にのみデータになります。 – Jeffrey

+1

@Jeffreyはどこに文書化されていますか? – Max

関連する問題