Распараллелить цикл for, используя многопоточность в Java - PullRequest
0 голосов
/ 04 октября 2018

У меня есть цикл for в java со следующей структурой, которую мне нужно распараллелить в фиксированное количество потоков.Допустим, это число в numThreads.Цикл for приведен ниже.Обратите внимание, что только внешний цикл должен быть распараллелен.Я думаю, что мне нужно использовать Executor, но я не могу понять, как разделить рабочую нагрузку на разные потоки, и если это изменит мои индексы внутри цикла в выражениях типа isInsulator[x][y].в основном я хочу, чтобы разные потоки разделяли значение X и запускали цикл for для тех значений x, которые им присвоены.Имеет ли это смысл?Может ли кто-нибудь помочь мне достичь этого или, может быть, подтолкнуть меня в правильном направлении, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 04 октября 2018
  1. Напишите тест (чтобы вы могли доказать, что он действительно быстрее с параллельной обработкой), используйте JMH.
  2. Перепишите код, чтобы он был produce_inputs->process->collect_or_summarize конвейером
  3. Используйте параллель *API 1007 * s (он использует внутренний пул объединения вил, настроенный на количество процессоров в коробке).
  4. Сравните производительность последовательной и параллельной обработки.
int result = IntStream.generate(() -> 42) // lazy inputs source
        .limit(100) // limit number of inputs
        .parallel() // use parallel processing
//      .sequential() // ...or sequential processing
        .map(x -> x + 1) // do the processing
        .reduce(0, Math::addExact); // summarize the result
//      .collect(toList()); // ...or just collect it to a container
0 голосов
/ 04 октября 2018

Вы можете объявить фиксированный пул потоков (он будет инициализировать и использовать только указанное количество потоков):

Executor executor = Executors.newFixedThreadPool(numThreads);

Вы должны отправить X задач в пул потоков:

for (int i = 0; i < X; i++) {
        final int x = i;
        executor.execute(() -> submitTask(x));
}

В методе submitTask вы можете определить свою логику:

private void submitTask(final int x) {
    for (int y = 0; y < Y; y++) {
        //do stuff
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...