【发布时间】:2015-11-13 05:23:27
【问题描述】:
我有一个数据生产者,它在单独的线程中运行并将生成的数据推送到连接到PipedInputStream 的PipedOutputStream。此输入流的引用通过公共 API 公开,以便任何客户端都可以使用它。 PipedInputStream 包含一个有限的缓冲区,如果已满,则阻塞数据生产者。基本上,当客户端从输入流中读取数据时,数据生产者会生成新数据。
问题在于数据生产者可能会失败并抛出异常。但是由于消费者在单独的线程中运行,因此没有很好的方法将异常发送给客户端。
我所做的是捕获该异常并关闭输入流。这将导致IOException 在客户端出现消息“管道已关闭”,但我真的很想向客户说明这背后的真正原因。
这是我的 API 的粗略代码:
public InputStream getData() {
final PipedInputStream inputStream = new PipedInputStream(config.getPipeBufferSize());
final PipedOutputStream outputStream = new PipedOutputStream(inputStream);
Thread thread = new Thread(() -> {
try {
// Start producing the data and push it into output stream.
// The production my fail and throw an Exception with the reason
} catch (Exception e) {
try {
// What to do here?
outputStream.close();
inputStream.close();
} catch (IOException e1) {
}
}
});
thread.start();
return inputStream;
}
我有两个想法可以解决这个问题:
- 将异常存储在父对象中并通过 API 将其公开给客户端。 IE。如果读取失败并返回
IOException,客户端可以向 API 询问原因。 - 扩展/重新实现管道流,以便我可以将原因传递给
close()方法。然后流抛出的IOException可以包含该原因作为消息。
有更好的想法吗?
【问题讨论】:
标签: java multithreading