[英]concurrent file processing
我有一個動態保存大量文件的目錄。 目前,有一項任務會不時地列出文件並按順序處理它們(寫入數據庫)。 由於文件數量的增加,有必要實現這些文件的並行處理。 你能在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 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
一個線程池,並同時運行多個線程。
我知道它本質上不是相同的過程,但假設你知道如何處理文件,你可以看看下面關於不同上下文中多線程的問題 : 關於java中同步的問題; 何時/如何/到何種程度
如果我理解你的單個任務處理從讀取到加載在DB中。 您可以根據性質(以數據庫為中心,以CPU為中心或以IO為中心)將此任務分解為不同的任務。 例如,您可以執行以下不同的任務
當前任務從目錄中選取文件並將其傳遞給下一個任務。
IO Centric - 讀取文件並存儲在內存中的新任務,然后傳遞給下一個taks。
DB centric - 將數據從內存加載到數據庫然后清理內存的新任務。
IO中心 - 將文件移動到其他位置。
為了進一步提高性能,您可以使用線程池實現任務2,3,4。這將允許並行處理多個文件。 根據任務的復雜性,您可以在列表中添加或刪除任何任務以滿足您的要求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.