我需要生成 N 个消费者线程,它们同时处理相同的 InputStream,例如 - 以某种方式对其进行转换、计算校验和或数字签名等。这些消费者不相互依赖,并且它们都使用第三方库,这些库接受 InputStream 作为数据来源。
所以我能做的是 - 创建一些 InputStream 的实现,这将
- 从“父”流中读取数据块
- 解锁消费者
- 等到每个消费者都读完整个块
- 读取下一个块
虽然看起来很简单,但它可能会引发各种问题,例如某些消费者死亡时的活锁、实现所有 InputStream 方法、使用屏障/闩锁控制消费者自己的 fork/join 等。
一位哥们告诉我,实施需要半个小时,这让我度过了一个晚上。
我更喜欢使用足够成熟的东西(谷歌搜索没有结果,因此我的 google-fu 不够好?)或者不打扰并将整个“源”流复制到临时文件中并将其用作数据来源。后一种解决方案似乎更可靠,但最终可能会创建千兆字节文件(例如在处理流式音频时)。