我有一个动态保存大量文件的目录。目前,有一项任务会不时地列出文件并按顺序处理它们(写入数据库)。由于文件数量的增加,有必要实现这些文件的并行处理。你能在java中给我一些想法和代码示例吗?
答案 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为中心)将此任务分解为不同的任务。例如,您可以执行以下不同的任务
当前任务从目录中选取文件并将其传递给下一个任务。
IO Centric - 读取文件并存储在内存中然后传递给下一个taks的新任务。
以数据库为中心 - 将数据从内存加载到数据库然后清理内存的新任务。
以IO为中心 - 将文件移至其他地方。
为了进一步提高性能,您可以使用线程池实现任务2,3,4。这将允许并行处理多个文件。根据任务的复杂性,您可以在列表中添加或删除任何任务以满足您的要求。