java - 不确定是否最好将包装类或静态用于需要由多个线程查看的变量
问题描述
我仍在学习 Java,需要有关最佳实践的建议。
这是场景:
- 一个加密的文件进来
- 一个 java 应用程序会在文件出现时拾取该文件。
- 侦听文件的类中的 java 应用程序在其 main 方法中创建 5 个阻塞队列(用于消费者),启动一个生产者和 5 个消费者线程。
- 生产者线程读取文件并创建 1 个大对象,其中包含 5 个其他较小的对象。
- 然后生产者线程将每个大对象放入阻塞队列。
- 每个消费者线程查看自己的阻塞队列,检索大对象,然后检索 5 个较小对象中的 1 个,并使用与该 1 个小对象相关的信息写入文件。
我的问题:如果生产者线程在读取文件时出现任何问题,我希望监听类(启动所有内容的类)知道它,以便它可以将加密文件的扩展名更改为 .err
我还希望其他 5 个消费者线程知道生产者线程中是否发生错误,以便他们也可以将每个创建的文件的扩展名更改为 .err
不确定在我传递到阻塞队列中的这个场景中是否会更多地推荐包装类,或者在所有线程都可以查看的侦听或生产者类中使用静态变量以了解是否发生错误。谢谢您的帮助
或者如果有更好的解决方案请告诉我
解决方案
如果不是让每个子线程将其结果写入文件,而是将结果聚合回结果处理程序,该怎么办?这样,如果出现错误,结果处理程序可以适当地处理它(通过添加 .err 扩展名)。
并发的大部分性能优势都与更好的 CPU 使用率有关,但是由于您正在写入单个硬件(可能是磁盘),因此并发执行该操作确实没有优势。
这种方法的主要缺点是您的内存开销会更大一些,因为您必须将每个使用者的输出保留在内存中,直到所有五个都完成写入,而不是能够让它们分别完成并分别持久化. 老实说,无论如何你都必须这样做,因为一个消费者中的错误可能会在其他消费者已经完成并持续存在之后发生。
推荐阅读
- excel - excel公式匹配单元格背景颜色
- javascript - /* @flow strict */ 在所有源文件上
- android - 如何在Horizontal ScrollView中自然滚动人们猜测的?
- python - 删除缺失类的行 AND 缺失特征超过 4 个的行
- vba - TextBox.SelStart/SelLength 和长字符串
- c++ - 在 Windows 上从 C++ 代码运行 WSL 命令
- matlab - matlab中的阴影置信区间
- java - DirtiesContext 没有表后测试
- android - 如何在 sw 地图应用程序中重命名照片描述
- javascript - 如何将 ReactDOM.render 与其他 ReactDOM.render 通信