Синхронизация пула потоков Java - PullRequest
4 голосов
/ 29 ноября 2011

Я хотел бы выполнить следующий алгоритм - это должно быть сделано в Java

for(int i = 0; i< 100; i++){
    create 8 threads which perform a task
    wait for all threads to finish
}

Желательно, чтобы потоки не создавались и не уничтожались непрерывно из-за накладных расходов (и того факта, что каждый поток будет иметь<20 миллионов секунд работы), что привело к идее Thread Pools <a href="http://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html" rel="nofollow"> 1 .Я также знаю, что, используя Executable 2 , можно вызвать shutdown, а затем awaitTermination.Однако в этом случае это нежелательно из-за петли.Таким образом, как может происходить синхронизация потоков?

Я хотел бы синхронизировать потоки в пуле потоков, как это было бы сделано с использованием традиционного метода join () потока.

Ответы [ 3 ]

5 голосов
/ 29 ноября 2011

Вы пробовали смотреть на циклический барьер . Он оптимизирован, чтобы позволить группе потоков останавливаться и ждать, пока все не достигнут общего барьера. Я не вижу никакой причины, по которой его нельзя использовать с известным количеством объединенных потоков со ссылками на общий барьер. Может возникнуть некоторая дополнительная сложность, если вам нужно синхронизировать обратный вызов, вызванный с барьерами await() count достигнут, поскольку он выполняется в другом потоке

2 голосов
/ 29 ноября 2011

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

0 голосов
/ 29 ноября 2011

Посмотрите на структуру fork / join в jdk 7.

...