Я пытаюсь реализовать тяжелый процесс вычисления в массиве данных.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();
Возможно ли это?
В противном случае, как я мог это сделать, пользуясь многопоточными возможностями полного процессора?
Ваше описание проблемы требует некоторой работы. Неясно, как вы раскалываете работу. –
@ Даниэль Сперри, что я должен точно объяснить? –
Как именно каждый DATAItem (я полагаю, это вызываемый) изменяет исходный массив? на месте? создавая новый массив с несколькими дополнительными элементами? Если это действительно модифицирует исходный массив, на месте, то как вы мешаете вводу других DATAItems? Возможно, описание вашей реальной проблемы поможет. –