簡體   English   中英

並發文件處理

[英]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中同步的問題; 何時/如何/到何種程度

Java中的並行處理; 需要建議,即在Runnanble / Callable接口上

如果我理解你的單個任務處理從讀取到加載在DB中。 您可以根據性質(以數據庫為中心,以CPU為中心或以IO為中心)將此任務分解為不同的任務。 例如,您可以執行以下不同的任務

  1. 當前任務從目錄中選取文件並將其傳遞給下一個任務。

  2. IO Centric - 讀取文件並存儲在內存中的新任務,然后傳遞給下一個taks。

  3. DB centric - 將數據從內存加載到數據庫然后清理內存的新任務。

  4. IO中心 - 將文件移動到其他位置。

為了進一步提高性能,您可以使用線程池實現任務2,3,4。這將允許並行處理多個文件。 根據任務的復雜性,您可以在列表中添加或刪除任何任務以滿足您的要求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM