我希望能够有一个线程等待一个或多个流/管道上的数据可用,然后轮询读取数据(然后再次等待更多)

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
       }
    }
}

最佳答案

标准Java IO API是一种阻塞实现。换句话说,如果您有一个带有循环的线程,如下所示:

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


然后,该线程将阻塞,直到有需要从流中读取的内容(或流关闭,没有更多数据等)为止,从描述中听起来这就像您要执行的操作。

此外,从您的代码中看起来您想读取过程输出。确保您也从进程中耗尽了其他流(例如stderr),否则将超出限制并获得异常。

09-11 06:37