并发文件处理

时间:2011-03-09 14:48:25

标签: java multithreading parallel-processing

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

5 个答案:

答案 0 :(得分:3)

使用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
        }
   });
}

答案 1 :(得分:1)

查看java.nio.file中的Watch Servie API。这是文档和教程:http://download.oracle.com/javase/tutorial/essential/io/notification.html

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

答案 2 :(得分:0)

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


http://download.oracle.com/javase/tutorial/essential/concurrency/

http://download.oracle.com/javase/7/docs/api/java/lang/Thread.html

答案 3 :(得分:0)

如果您熟悉Java中的并发性,那就不是很明显了,所以我首先来看看Java Concurrency Tutorial。这是一个很好的起点。

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

之后,您可以使用ExecutorService创建一个线程池,并同时运行多个线程。

我知道它本质上不是相同的过程,但假设您知道如何处理文件,您可以在不同的上下文中查看以下有关多线程的问题: questions around synchronization in java; when/how/to what extent

Parallel-processing in Java; advice needed i.e. on Runnanble/Callable interfaces

答案 4 :(得分:0)

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

  1. 当前任务从目录中选取文件并将其传递给下一个任务。

  2. IO Centric - 读取文件并存储在内存中然后传递给下一个taks的新任务。

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

  4. 以IO为中心 - 将文件移至其他地方。

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