Как приостановить основной поток для одновременного выполнения двух методов, а затем вернуться обратно в основной поток? - PullRequest
0 голосов
/ 15 января 2019

У меня есть класс, который содержит 5 методов. В определенный момент в программе я хотел бы запустить 2 метода одновременно. Диаграмма ниже иллюстрирует то, о чем я говорю. После завершения method2 () я хочу, чтобы method3 () и method4 () выполнялись одновременно. Method3 () и method4 (), по сути, делают одно и то же, но имеют изолированные ресурсы и, следовательно, не должны синхронизироваться. Когда method3 () и method4 () завершатся, я бы хотел, чтобы потоки Aux были уничтожены, а программа вернулась обратно в основной поток. Каков наилучший способ сделать это?

Image of program threads

Я попытался вызвать ExecutorService, но, похоже, это создает потоки, которые работают одновременно с основным потоком, а не приостанавливает основной поток.

 ExecutorService executorService = Executors.newFixedThreadPool(2);

            // method reference introduced in Java 8
            executorService.submit(this::method3());
            executorService.submit(this::method4());

            // close executorService
            executorService.shutdown();

1 Ответ

0 голосов
/ 15 января 2019

executorService.submit возвращает Future<T>, по которому вы можете позвонить get(), чтобы заблокировать ваш поток. Итак:

ExecutorService executorService = Executors.newFixedThreadPool(2);

Future<?> f1 = executorService.submit(this::method3());
Future<?> f2 = executorService.submit(this::method4());

f1.get();
f2.get();

executorService.shutdown();

f1.get() и f2.get() будут блокировать основной поток, пока оба фьючерса не будут завершены. Также, если вам нужно создать службу executor несколько раз, было бы лучше оставить службу executor без вызова shutdown(). Темы будут просто парковаться.

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