Цикл ForEach при прерывании и объединении потоков - PullRequest
1 голос
/ 30 сентября 2019

Имея ArrayList<Wheel> колеса, будучи классом Wheel, который расширяет Thread , что произойдет, если у меня будет следующее:

wheels.forEach(a -> {
                try{
                    a.interrupt();
                    a.join();
                }catch(InterruptedException exception){}
            });

Каков будет порядок команд из этого кода?

Прямо сейчас я думаю, что это пойдет следующим образом: 1) a прервано, 2) мой основной поток присоединится a ТОЛЬКО ПОСЛЕ окончания будет ли цикл forEach продолжаться через оставшиеся элементы, верно?

Возможно ли выполнить итерацию в ArrayList, где все потоки в нем будутпрервал и присоединился, не делая это шаг за шагом вручную?

Большое спасибо за помощь!

1 Ответ

0 голосов
/ 30 сентября 2019

Комментарий Джонни правильный для вашей текущей реализации. Вы также можете пойти по другому пути, как;

Вместо расширения потока вы можете реализовать Runnable (или Callable) в своем классе Wheel и отправить свой список задач в службу исполнителя. Таким образом, вы можете воспользоваться преимуществами пула потоков (повторного использования потоков) и использовать встроенные функции отключения и ожидания завершения всех потоков.

Пример:

ExecutorService executor = Executors.newFixedThreadPool(5);
wheels.foreach(wheel -> executor.submit(wheel));

//when you want to shutdown
executor.shutdownNow(); // this will send interrupt to thread pool threads.
executor.awaitTermination(10, TimeUnit.SECONDS); 
// block the current thread until executor finishes or timeout expires. 
// You could give a bigger timeout or call this with in a while loop to ensure 
// executor definitely finished.
// like this: while(!executor.awaitTermination(10, TimeUnit.SECONDS));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...