Распараллеливание использования функции для цикла - PullRequest
0 голосов
/ 01 марта 2020

У меня есть целочисленный массив значений, для которого мне нужно вычислить некоторое число для каждого значения. Я пытаюсь распараллелить это, например, я делю массив на несколько разделов, а затем вычисляю каждый раздел в своем собственном потоке. Для этого я создал для l oop, который перебирает разделы следующим образом:

    for (int i = 0; i < arrSplit.length; i++) {
        Thread t = new Thread(new Runnable() {  
            @Override
            public void run() {
                for (int j = arrSplit[i].startIndex; j < arrSplit[i].startIndex+arrSplit[i].length; j++) {
                    factors[j] = numPrimeFactors(values[j]);
                }
            }
        });
    }

Следующие две проблемы возникли у меня:

  • "local переменная, определенная во вложенной области видимости, должна быть конечной или фактически конечной " - я знаю, что моя переменная" i "в" arrSplit [i] "находится вне области действия, но я не знаю, как получить доступ это и не совсем понятно, почему это выходит за рамки.
  • Как я могу присоединиться к своим потокам? - Если бы я присоединился к каждому потоку в пределах для l oop, я бы эффективно сделайте распараллеливание устаревшим, потому что следующий поток будет запущен только после того, как первый был уже присоединен, верно? Так как я могу go об этом?

1 Ответ

5 голосов
/ 01 марта 2020

"локальная переменная, определенная во вложенной области видимости, должна быть конечной или фактически конечной"

Она не выходит за пределы области, она говорит, что она не является ни окончательной (потому что она не объявлена ​​окончательной), ни фактически финал (потому что вы увеличиваете его в части обновления для l oop).

Вы можете объявить final int ii = i; внутри внешнего l oop и использовать ii вместо i внутри работоспособного.

Но на самом деле вам, похоже, не нужен i, кроме как для доступа к arrSplit[i]. Таким образом, было бы проще использовать расширенный для l oop:

for (SplitType s : arrSplit) {
  // Use s in place of arrSplit[i].
}

Как я могу присоединиться к моим темам?

Поместить их в список и затем вызовите join для каждого элемента по очереди после их запуска.

Но может быть проще использовать что-то вроде параллельных потоков, поэтому вам не нужно управлять потоками или даже расколы, сами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...