0

とても簡単な質問があります。
Java I/O スキームに基づいて、スレッドがデータを待っているときはいつでもブロックされるのでしょうか? それは本当ですか?このようなもの。

byte[] _buff=new byte[1024];
int _r=_in.read(_buff);//it blocks until some data is available

読み取りをあきらめる唯一の方法は、別のスレッドでストリームを閉じることです。それは正しいですか? このようなもの。

void run(){
_in.close();
}

上記のシナリオが正しければ、なぜこれが不可能なのかSystem.in、ストリームを閉じて読み取り中のスレッドを中断するだけです。5 秒間待機するスレッドを実行してから、ストリームからの残りの読み取りを中断/放棄したいと考えています。

void _read_data(){
  System.out.print("enter y to save the workspace ");
  new Thread(_cancel_thread).start();
  int _r=System.in.read();//blocks
}
///////////
void run(){
  try{
   Thread.sleep(5000);
   System.in.close();//doesn't work.
  }catch(Exception _ex){}
}

質問:
1.ストリームを閉じるには?! ストリームを閉じるスレッドがストリームを閉じることができないのはなぜですか?!
2.ストリームが閉じられたら、どうすれば再び開くことができますか?!

4

1 に答える 1

2

最初の質問については、おそらく(わからない、わからない)ストリームが下位レベルによってロックされているためだと思います。そのため、ロックされている間、別のスレッドがロックを取得して閉じるのを待っているだけです。
2つ目は、キーボードストリームで動作するクラス(ストリーム)があるかどうかは本当にわかりませんが、なぜ本当にそれを閉じたいのですか? ストリームをどこかに( などin=System.in)保持し、 を呼び出して標準ストリームを別のストリームにリダイレクトし、System.setIn(newStream)キーボードストリームを元に戻したいときはいつでも、ストリームを参照でリセットします。デフォルトのシステム入力ストリームを閉じるのは良い考えではありません. または のいずれか

を利用することをお勧めします. これらの人はブロックせず、代わりにイベントをリッスンします.JConsoljNativeHook

于 2013-11-03T14:24:58.350 に答える