2013-10-04 3 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()) { 
      } 

// то у меня есть пробег(), который в основном чтение/запись к files.Is это хороший подход, Есть ли что-нибудь, который я могу сделать, чтобы сделать его лучше.

+2

Используйте 'executor.awaitTermination (...)' после выключения вместо цикла занятости. – Pyranja

+0

Лучше во что? –

+1

У вас есть занятая голова в качестве последнего звонка, это ** очень ** плохая практика. Используйте 'executor.awaitTermination (...)' как предложено @Pyranja. –

ответ

0

Помимо проблемы с оживленным ожиданием, уже объясненной в комментариях, нет очевидных проблем с кодом. Поэтому, учитывая, что он работает нормально, как вы сказали, спросите себя: есть ли необходимость изменить его? Какие аспекты вы хотели бы улучшить, изменив код?

Из голубой некоторые подсказки, чтобы дать вам идеи:

  • Создание ExecutorService является операция довольно тяжелый вес. Но вы можете создать одну услугу один раз (например, при запуске приложения) и повторно использовать ее во время выполнения приложения.

  • Если вы хотите, чтобы переместить работу из или сбора результатов от задач асинхронных, рассмотреть возможность реализации интерфейса Callable<T> вместо Runnable/Thread и использовать executor.submit(...). Он вернет Future<T>, который будет содержать результат, как только будет завершена асинхронная задача.

Смежные вопросы