2013-10-04 99 views
1

我有一個要求,我需要平行處理多個文件,我已經完成了下面,它的工作正常,但我怎樣才能使它更優化,期待任何建議。並行處理文件

long start = System.currentTimeMillis(); 
     File [] files=new File("C:\\ftp").listFiles(); 
     //System.out.println(files.length); 
     ExecutorService executor=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); 
      // System.out.println("available processors.."+Runtime.getRuntime().availableProcessors()); 
     if(files.length>=1) 
     { 
      for(int i = 0;i<files.length; i++){ 
       System.out.println("reading..."+i); 
       Runnable workerThread = new FileWorkerThread(files[i]); 
       executor.execute(workerThread); 
          } 
      executor.shutdown(); 
      while (!executor.isTerminated()) { 
      } 

//然後我有一個run(),這是基本的讀/寫的files.Is這是一個好辦法,有什麼我可以做,使之更好。

+2

關閉後使用'executor.awaitTermination(...)'而不是繁忙的循環。 – Pyranja

+0

更好的是什麼? –

+1

作爲最後一次通話,您有一個忙碌的等待,這是非常糟糕的做法。按照@Pyranja的建議使用'executor.awaitTermination(...)'。 –

回答

0

除了繁忙的等待問題,已經在評論中解釋過,代碼沒有明顯的問題。所以考慮到它可以正常工作,就像你說的那樣,問問自己:有沒有必要改變它?您想通過更改代碼來改進哪些方面?

出於藍一些提示,讓您的想法的:

  • 創建的ExecutorService是一個相當重量級的操作。但是您可以創建一次服務(例如,在應用程序啓動時),並在整個應用程序運行時重用它。

  • 如果你想從異步任務移動工作的或收集的結果,考慮實施Callable<T>接口而不是Runnable/Thread和使用executor.submit(...)。它將返回一個Future<T>,它將在異步任務完成後立即保存結果。