今私は自分のプログラムで2つのスレッドを実行しています。常にユーザーからの入力を読み取ろうとし、もう一方はタイムアウトを監視します。ユーザーが一定の時間内に入力を送信しない場合、タイムアウトが発生します。 2つのスレッドは次のようになります。タイムアウトを監視する専用のスレッドが必要ですか?
ユーザ入力スレッド
while(true){
if(in.hasNextLine()){
processLine(in.nextLine());
timeLastRecieved = System.currentTimeMillis();
}
}
タイムアウトスレッド
while(true){
//Check for a timout
if(timeLastRecieved+timeoutDuration <= System.currentTimeMillis())
timeUserOut();
else{
//Sleep until it is possible for a timeout to occur
Thread.sleep((timeLastSent+timeoutDuration) - System.currentTimeMillis());
}
}
私はこれらのスレッドが分離している今のところ
が、私はこのようにそれらを組み合わせることができ...
while(true){
if(in.hasNextLine()){
processLine(in.nextLine());
timeLastRecieved = System.currentTimeMillis();
}
//Check for a timout
if(timeLastRecieved+timeoutDuration <= System.currentTimeMillis())
timeUserOut();
}
しかし、実際には頻繁にタイムアウトを確認する必要はありません。スレッドを結合してタイムアウトを頻繁にチェックするか、2つのスレッドを用意する必要があります。私は適切なコーディングエチケットであるので、パフォーマンスについて心配していません。それが何かを意味するならば、15分のようなものでタイムアウト期間。
EDIT:2つのスレッドを持つバージョンでは私は眠っていますが、結合バージョンではスレッドをスリープ状態にはしません。これは明らかにタイムアウトが必要以上に実行されるかどうかをチェックするif文を引き起こします。
読み取りスレッドがユーザー入力をポーリングすると、タイムアウトも処理できます。結局のところ、私が正しくあなたを理解していれば、それは入力を待つためのタイムアウトなので、消費者スレッド(世論調査)はとにかく時間切れになるでしょう。私は、ユーザー入力の処理に時間がかかり、たとえば次のポーリングが16分後に発生し、ユーザーが15分後に入力を提供した場合、 30両方を行うポーリングスレッドがタイムアウトを認識しないことがあります。 – Thomas
また、入力を処理する前に 'timeLastRecieved = System.currentTimeMillis();'を置くことを検討すると、処理に必要な時間がタイムアウトのしきい値を増加させます。 – Thomas
良い点@トーマス。タイムアウトは約15分に設定されていますが、処理の長さは数ミリ秒を超えてはならないので、私は心配していません。私の質問の根源は、2つの効率的なスレッドを持つ方が良いかどうか、あるいはif文を実行するスレッドがより頻繁に必要な場合です。 – user6629259