我想以非阻塞的方式阅读一些InputStream
。这是一个例子:
public Result getResult(InputStream ... inputStreams) {
final Result result = new Result();
for (InputStream stream : inputStreams) {
// TODO: read input streams without blocking here
// write output using result.log.add(...) when it gets to a \n (newline)
}
return result;
}
public class Result {
public final Collection<String> log = new ConcurrentLinkedDeque<>();
}
所以我可以通过以下内容为每个InputStream
开始一个新主题:
new Thread(() -> { // TODO: read here }).start()
。
甚至使用ExecutorService但我不想自己启动线程并由JDK管理。这样的事情可能吗?
(我有一个根据请求打印Result.log
的流程。)
答案 0 :(得分:1)
您可以使用AsynchronousFileChannel
等部分执行此操作。这有助于您不必等待文件读取,一旦读取文件,JDK将调用提供的CompletionHandler
的complete
方法(编写您自己的方法以满足需要)上市)。 complete
方法异步运行,但javadoc确实建议您确保它尽可能高效地运行以防止阻塞其他文件(如果您需要生成Result
的多个实例,这可能是个问题一段时间。
希望这有帮助。
答案 1 :(得分:0)
您可以使用BufferedInputStream及其read(byte[] b,int off, int len),因为它是非阻塞的。如果只想读取一个字节,则使用字节[1]。
这解决了读取非阻塞的问题。但是你仍然有另一个:你想同时为多个流做这个,你想要返回结果。 AFAIK没有简单的方法可以摆脱这种局面。您将必须创建并启动多个线程,保留引用并等待所有线程加入。