java - Java异步文件写入PipedOutputStream/PipedInputStream(或Reader/Writer)与BlockingQueue的异同

标签 java multithreading io

<分区>

我正在尝试修改一个串行程序,该程序从数据库读取并将结果写入文件,这是以阻塞方式完成的,我认为我们可以获得内存缓冲区和文件的性能提升在“后台”异步写入

我可以想到“求职面试”解决方案,使用线程、共享资源、同步块(synchronized block)等... 但我确信有更好的方法(是否有一个不错的小“延迟写入”库可以为我做这件事?)

java.util.concurrent 包有任何帮助吗? java.nio?或者 JMS/ActiveMQ?

PipedOutputStream/PipedInputStream 作为我的缓冲区的基础怎么样?

如何在 Java 中实现延迟/后台/缓冲/非阻塞/异步文件编写器?

编辑:

根据建议,为了避免关闭此问题(因为我认为它仍然与答案、评论和投票相关),这里尝试使其更加集中。 (我保留上面的原始问题,所以答案仍将保留在上下文中,因为有一些非常好的答案)

  • PipedOutputStream/PipedInputStream(或PipedReader/PipedWriter)和之间的实际区别是什么阻塞队列
  • 使用后者进行异步文件写入是否更可取? (或者这是苹果与橘子的比较,如果是,我想知道为什么?)

最佳答案

您可能希望在生产者(数据库读取器)和消费者(文件写入器)之间使用有界阻塞队列。

Java 的 ArrayBlockingQueue做得很好。如果缓冲区已满,生产者将阻塞,从而避免消耗过多内存的任何问题。

在并发线程中进行生产和消费最好使用 Java 的 Executors 来实现框架。

关于java - Java异步文件写入PipedOutputStream/PipedInputStream(或Reader/Writer)与BlockingQueue的异同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10408055/

相关文章:

c - 加入 POSIX 线程返回 3

windows - 为什么此路径无法在 PERL 中打开 Windows 文件?

python - 如何在不重新启动守护进程的情况下读取和截断 snmptrapd 日志文件

java - 为什么加载 jruby 的可执行 jar 不能在名称中带有空格的文件夹(例如 Program files)下运行?

java - 如何在 NetBeans 的 Web 自由格式应用程序中添加外部 JAR 文件?

multithreading - Tir 与其他 Lua Web 框架相比如何?

Python、SQLite 和线程

c - 如何交换命令行中指定文件(文件名和字符)中的字符?

java - Swing 显示多个子 jframe

java - 对同一 Web 服务进行多个异步调用的最佳方法