Предположим, что у меня есть 5 потоков, которые должны составлять в общей сложности 1,000,000
вызовы функций для параллельной программы метода Монте-Карло. Я назначил 1,000,000/5
вызовы функций для каждого из 5 потоков. Однако после многих тестов (в некоторых тестах до 1 триллиона итераций) я понял, что некоторые потоки заканчиваются намного быстрее, чем другие. Поэтому вместо этого я хотел бы динамически назначать рабочую нагрузку для каждого из этих потоков. Мой первый подход включал переменную AtomicLong
, которая была установлена на начальное значение, скажем, 1 миллиард. После каждого вызова функции, я бы уменьшаем AtomicLong
на 1. Перед каждым вызовом функции программа будет проверять, если AtomicLong
было больше, чем 0
, как это:Динамическое распределение рабочей нагрузки для нескольких потоков в Java
AtomicLong remainingIterations = new AtomicLong(1000000000);
ExecutorService threadPool = Executors.newFixedThreadPool(5);
for (int i = 0; i < 5; i++) {//create 5 threads
threadPool.submit(new Runnable() {
public void run() {
while (remainingIterations.get() > 0) {//do a function call if necessary
remainingIterations.decrementAndGet();//decrement # of remaining calls needed
doOneFunctionCall();//perform a function call
}
}
});
}//more unrelated code is not show (thread shutdown, etc.)
Такой подход, казалось, очень медленно, я Я правильно использую AtomicLong? Есть ли лучший подход?
Вы пытались проверить: - http://stackoverflow.com/questions/12735739/atomiclong-operations? –