2016-05-07 4 views
0

Скажем, я даюсь функциюЯ не понимаю темы

Data[] foo(double[] someNumbers, Data[] someData, AnalyzeTool tool, int numOfThreads) 

, массива, имеющих одинаковую длину LEN.

Теперь я хотел бы вызвать потоки numOfThreads в методе, используя инструмент для обработки каждого объекта Data.Object и записать его один из другого в Data [], чтобы данные Data [] были заданы и данные [] записаны в порядке.

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

Есть ли у кого-нибудь пример, как это сделать? Радует любая конструктивная помощь.

+0

Это хороший учебник по ниткам. Речь идет о потоках POSIX, поэтому синтаксис не будет применяться к 'java', но понятия одинаковы независимо от того, на каком языке вы находитесь: https://computing.llnl.gov/tutorials/pthreads/ – yano

+1

Возьмите посмотрите ['ExecutorService'] (https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html), [' Executors'] (https://docs.oracle .com/javase/7/docs/api/java/util/concurrent/Executors.html) и ['Future'] (https://docs.oracle.com/javase/7/docs/api/java/util/ concurrent/Future.html) в пакете java.util.concurrent. –

+0

Каждый поток должен знать свою позицию в списке данных, а также длину списка. Вот как они узнают, что остались данные. Кроме того, я не уверен, что вы полностью понимаете термин «блокировка» в этом контексте потоковой передачи. –

ответ

0

Будучи новым для многопоточности, в моем опыте я бы сделал что-то вроде этого:

Учитывая я много задач, чтобы сделать с каждым данных [] пункт. скажем, каждый элемент данных - это работа.

ExecutorService предоставляет вам завод, где есть группа работников (пулы потоков), которые помогут вам выполнить всю вашу работу. Служба-исполнитель распределяет работу каждому из работников (Thread) один за другим, как только кто-то из них заканчивается, и там больше работы, они выделяются этим.

рассмотрим следующий пример:

ExecutorService executor = Executors.newFixedThreadPools(5); 
//lets say we have 5 workers with us. 

//then submitting all your work (a runnable) to the factory 
for(int i=0;i<n;i++){ 
    executor.submit(new work(someData[i])); 
} 

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

просто затем,

executor.shutdown(); 
1

Это будет сделано с использованием JDK 8 и потоков. Я что-то подобное себе:

List<Data> foo(List<Double> someNumbers, List<Data> someData, AnalyzeTool tool) { 
    return someData.parallelStream().map((t, n) -> t.doSomething(n)).collect(Collectors.toList()); 
}