【发布时间】:2011-07-11 23:20:44
【问题描述】:
我有一个动态保存大量文件的目录。目前有一项任务会不时列出文件并按顺序处理它们(写入数据库)。由于文件数量的增加,有必要对这些文件进行并行处理。请给我一些想法和java代码示例好吗?
【问题讨论】:
标签: java multithreading parallel-processing
我有一个动态保存大量文件的目录。目前有一项任务会不时列出文件并按顺序处理它们(写入数据库)。由于文件数量的增加,有必要对这些文件进行并行处理。请给我一些想法和java代码示例好吗?
【问题讨论】:
标签: java multithreading parallel-processing
使用 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 Servie API。这是文档和教程:http://download.oracle.com/javase/tutorial/essential/io/notification.html
此服务允许您注册目录上的文件通知更改。对于每个通知,您都可以进行任何您想要的处理。可能比实现自己的东西容易得多。
【讨论】:
创建一个类saver extends Thread 并在那里处理文件操作(在run() 方法中)?
http://download.oracle.com/javase/tutorial/essential/concurrency/
http://download.oracle.com/javase/7/docs/api/java/lang/Thread.html
【讨论】:
如果您熟悉 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
【讨论】:
如果我正确理解您从读取到加载数据库的单个任务处理。您可以根据性质(以 DB 为中心、以 CPU 为中心或以 IO 为中心)将此任务分解为不同的任务。例如你可以有不同的任务如下
当前任务从目录中选择文件并将其传递给下一个任务。
以 IO 为中心 - 读取文件并存储在内存中然后传递给下一个任务的新任务。
以数据库为中心 - 将数据从内存加载到数据库然后清理内存的新任务。
以 IO 为中心 - 将文件移动到其他位置。
为了进一步提高性能,您可以使用线程池实现任务 2、3、4。这将允许并行处理多个文件。根据任务的复杂性,您可以添加或删除列表中的任何任务以满足您的要求。
【讨论】: