从文件系统读取文件时的并发性

时间:2011-11-15 14:19:36

标签: java multithreading concurrency filesystems locking

我们有一个应用程序从特定文件夹中读取文件,处理它们并将其复制(某些业务逻辑)到另一个文件夹。

这里的问题是当要处理的文件数量非常大时,运行单个应用程序实例或单个线程不再足以处理这些文件。

我们采用的一种方法是启动应用程序的多个实例(我觉得这种方法有问题。如果有的话,建议我替代。)

生成线程或启动应用程序的多个实例时,应注意,如果线程读取一个文件并开始处理它,则另一个线程不应该拾取它。

我们正在尝试通过在文件夹中包含文件名列表的数据库表来实现此,这样当线程首次读取表中的文件名时,我们将更改状态到 进程中 已完成 并悲观地锁定表,以便其他线程无法读取它。

有没有更好的解决方案?

4 个答案:

答案 0 :(得分:1)

您可以使用现有的大多数实现作为前端处理器,将文件流提供给工作线程,您可以根据需求启动/停止这些线程。只有前端线程打开文件,因此没有可能会有一个工作人员干扰另一个工作。

编辑:添加了“不”这个词,因为它改变了意思......

答案 1 :(得分:0)

另请参阅JDK 7.它有一个新的文件I / O API和一个可能有用的fork / join框架。

答案 2 :(得分:0)

查看Apache Camel(http://camel.apache.org)及其文件组件(http://camel.apache.org/file2.html)。使用Camel可以非常轻松地定义一组处理指令,以原子方式使用目录中的文件,还可以配置线程池以同时处理多个文件。 Camel in Action是一本很棒的书,可以帮助你入门。

答案 3 :(得分:0)

你描述的内容让我想起了在UNIX上开发的经典风格。

在这种经典样式中,您可以将文件移动到正在进行中的目录,以便其他文件不会将其拾取。通常:您可以为每个处理状态使用一个目录,而不是将文件从一个状态移动到另一个状态。

这主要是因为file moves are atomic(至少在Unix系统和NFTS下)。

这种方法的好处在于,它很容易处理崩溃等有问题的情况,并且它自动拥有一个熟悉的好管理界面(文件系统GUI,ls,Windows资源管理器......)。 / p>