Создание Runnable из внешнего класса - PullRequest
0 голосов
/ 08 марта 2020

Я пытаюсь создать несколько задач, каждая из которых будет вызывать маршрут на нескольких маршрутизаторах. Я пытаюсь разбить основной список (ArrayList) маршрутизаторов на подсписки, которые каждый поток может перебирать.

Этот способ передачи переменных в потоки вызывает проблемы? Или это что-то еще.

nbTasks = количество Runnables routersPerThread = количество маршрутизаторов, которые каждый поток должен вызвать route () на

for (int i = 0; i < nbTasks; i++) {
    final List<Router> routerList = 
            routers.subList(i * routersPerThread, (i + 1) * routersPerThread);

    service.execute(new Runnable() {
        @Override
        public void run() {
            for (Router r : routerList) {
                r.route();
            }
            sem.release();
        }
    });
}

1 Ответ

2 голосов
/ 08 марта 2020

Вы столкнетесь с проблемами, когда список изменится во время работы потока. Это не происходит в коде, который вы показываете, поэтому с этим битом у вас все должно быть в порядке; например, если вы создаете список в конструкторе и никогда не меняете его.

Использование переменной sem выглядит странно. Вы отпускаете, но никогда не приобретаете его (при условии, что это семафор).

...