Java 并发文件处理

Java 并发文件处理,java,multithreading,parallel-processing,Java,Multithreading,Parallel Processing,我有一个目录,其中动态保存了很多文件。目前有一个任务,它不时列出文件并按顺序处理它们(写入数据库)。由于文件数量不断增加,有必要实现这些文件的并行处理。你能给我一些想法和一个java代码示例吗?创建一个类saver extensed Thread,并在那里处理文件操作(在run()方法中) 如果您熟悉Java中的并发性,这一点并不明显,因此我首先来看一下。这是一个好的开始 然后请记住,任何需要由多个线程访问的对象都应该是不可变的或同步的 接下来,您可以使用ExecutorService创建一

我有一个目录,其中动态保存了很多文件。目前有一个任务,它不时列出文件并按顺序处理它们(写入数据库)。由于文件数量不断增加,有必要实现这些文件的并行处理。你能给我一些想法和一个java代码示例吗?

创建一个类
saver extensed Thread
,并在那里处理文件操作(在
run()
方法中)



如果您熟悉Java中的并发性,这一点并不明显,因此我首先来看一下。这是一个好的开始

然后请记住,任何需要由多个线程访问的对象都应该是不可变的或同步的

接下来,您可以使用
ExecutorService
创建一个线程池,并同时运行多个线程

我知道这本质上不是同一个过程,但假设您知道如何处理文件,您可以看看以下关于不同上下文中的多线程的问题:


使用执行器服务。创建一个
Executors.newFixedThreadExecutor(n)您可能可以将文件处理变成单个可运行(或可调用)任务,并将其传递到您可以处理的文件中

ExecutorService service = Executors.newFixedThreadExecutor(10);

for(final File file : directory.listFiles()){
   service.submit(new Runnable(){
        public void run(){
             //do work here on file object
        }
   });
}

看一看java.nio.file中的Watch服务API。以下是文档和教程:


此服务允许您注册目录上的文件通知更改。对于每个通知,您可以执行任何您想要的处理。可能比实现自己的东西要容易得多。

如果我正确理解您在DB中从读取到加载的单个任务处理。您可以根据任务的性质(以数据库为中心、以CPU为中心或以IO为中心)将此任务分为不同的任务。例如,您可以有如下不同的任务

  • 当前任务,从目录中拾取文件并将其传递给下一个任务

  • 以IO为中心—读取文件并存储在内存中,然后传递给下一个TAK的新任务

  • 以数据库为中心-将数据从内存加载到数据库,然后清理内存的新任务

  • 以IO为中心-将文件移动到其他位置


  • 为了进一步提高性能,您可以使用线程池实现任务2、3、4。这将允许并行处理多个文件。根据任务的复杂性,您可以添加或删除列表中的任何任务,以满足您的需求。

    +1:虽然这并不能回答问题,但对海报来说,这是一个很好的建议。除了步骤2,这是一个很好的建议。将整个文件读入内存(几乎)从来都不是一个好主意。将第2/3步合并为“将数据从文件流到数据库”。我同意内存部分,但要记住文件的位置。如果文件位于远程位置,则制作本地副本或将其保存在内存中(如果确定文件大小不会造成任何损害)。而且应用程序可以有一些逻辑来限制内存的使用。