2017-10-01 4 views
0

スレッドは、1つまたは複数のストリーム/パイプのデータが利用可能になるのを待ってから、データを取得してからもう一度待機してください。javaでは、データがストリームまたはパイプ上で利用可能になったときに通知される方法はありますか?

InputStream is = process.getInputStream() // stdout of process 
is.setOnDataAvailable((stream)-> { 
    readerThread.signal ... // tell thread to wake up or put worker task in queue 
}); 

// reader thread 
dataAvailable = true; // start assuming data there. 
for(;;) { 

    if(!dataAvailable) { 
     waitForSignal(); 
    } 
    dataAvailable = false; 
    for(allINputs) { 
     if(input.dataAvailable()) { 
      read it and do something 
      dataAvailable = true; // might be more check inputs again 
     } 
    } 
} 
+0

私はJavaの未来があなたのユースケースを処理できると思うhttps://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html – jeanr

+0

入力ストリームはブロックストリームですが、それはまだデータが有効になるまで読み取り操作がブロックされることを意味します。なぜあなたは上記のことをしたいのですか? – dabaicai

+0

@jeanr Javaの将来は、プロセスやスレッドのタスクを管理するために書かれた「ラッパー」APIのようですが、ストリームを読み込むためにプロセスやスレッドを手作業で作成するよりパフォーマンスの利点はほとんどありません。それを行う便利な方法。 – peterk

答えて

1

標準のJava IO APIはブロック実装です。言い換えれば、あなたは次のようになりますループ付きのスレッドがある場合:そこストリームから読み込むための何かがある(またはストリームが閉じるまで

byte[] input = ...; 
while (stream.read(input) != -1) 
{ 
    ... 
} 

は、その後、そのスレッドがブロックされます、それ以上のデータ等、ありませんが)、これはあなたがしたいことのように聞こえる音からです。

また、あなたのコードからは、プロセス出力を読み込むように見えます。プロセスから他のストリームも(stderrのように)排水することを確認してください。そうしないと、制限を超えて例外が発生します。

+0

本当にそうである可能性があり、生成されたプロセスなどで作成されたパイプが提供された場合、これらの非同期API機能を持つ「チャネル」などの新しいタイプのストリームを作成して管理することはできません。 – peterk

関連する問題