有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在java中,当数据在流或管道上可用时,是否有一种方法可以通知io

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

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

共 (1) 个答案

  1. # 1 楼答案

    标准javaioapi是一种阻塞实现。换句话说,如果有一个线程具有如下循环:

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

    然后,该线程将阻塞,直到有东西要从流中读取(或者流关闭,没有更多的数据,等等),从描述来看,这听起来像是您想要做的事情

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