2015-05-10 3 views
0

Я пытаюсь реализовать тяжелый процесс вычисления в массиве данных.Java ExecutorService и обновление часто используемого ressource

Для этого я использовал сервис Executor, чтобы иметь возможность получить результат каждой обработки при использовании всех возможностей ЦП.

Однако мне нужно передать следующий поток, работающий с массивом, с результатом, который я получаю из ранее выполненного потока, не дожидаясь завершения всех потоков.

Другими словами, массив shared_ressource является общим атрибутом для всех объектов DATAItem и изменяется каждым потоком (объект DATAItem).

Я хочу, чтобы эта модификация могла быть воспринята следующим объектом DATAItem в цикле for (заменена циклом While здесь) с использованием потоков.

int np = Runtime.getRuntime().availableProcessors(); 
    ExecutorService pool = new ThreadPoolExecutor(np-2, np-2, 5000,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()); 
// shared_ressource is the array of objects from class SharedRessource to be modified by each thread 
    int i = 0; 
    while (i<shared_ressource.size()) 
    { 
     if (((ThreadPoolExecutor) pool).getActiveCount()<=(np-2)) 
     { 
     DATAItem di = new DATAItem(); 
     di.setSharedRessource(shared_ressource); 

     Future<List<SharedRessource>> DataItemMod = pool.submit(di); 
     // the Future's .get() method returns the modified shared_ressource array 
     i++; 
     } 
     else 
      try {Thread.sleep(100);} 
      catch (InterruptedException e) {e.printStackTrace();} 

    } 

     pool.shutdown(); 

Возможно ли это?

В противном случае, как я мог это сделать, пользуясь многопоточными возможностями полного процессора?

+0

Ваше описание проблемы требует некоторой работы. Неясно, как вы раскалываете работу. –

+0

@ Даниэль Сперри, что я должен точно объяснить? –

+0

Как именно каждый DATAItem (я полагаю, это вызываемый) изменяет исходный массив? на месте? создавая новый массив с несколькими дополнительными элементами? Если это действительно модифицирует исходный массив, на месте, то как вы мешаете вводу других DATAItems? Возможно, описание вашей реальной проблемы поможет. –

ответ

0

Вы планируете выполнять последовательную обработку, поэтому даже если вы используете потоки ... вторая нить не может обрабатываться параллельно первому потоку с , она ждет завершения первого. Возможно, вы можете посмотреть на функцию объединения потоков, где join делает поток ждать, пока другой поток завершит выполнение.