Как выполнить асинхронный фрагмент кода после того, как другой асинхронный фрагмент кода завершил выполнение в Java (последовательно)? - PullRequest
0 голосов
/ 16 мая 2018

У меня есть следующие фрагменты кода:

1)

int operationCnt = 10;
for (int i = 0; i < operationCnt; i++) { // for every instruction
    final int curOperation = i;
    post(new Runnable() {
        @Override
        public void run() {
            // execute something on the UI thread

            if (curOperation == operationCnt) {
                // Execution has finished RUN THE NEXT PIECE OF CODE SOMEHOW
            }

        }
    })
}

2)

int operationCnt2 = 10;
for (int i = 0; i < operationCnt2; i++) { // for every instruction
    final int curOperation = i;
    post(new Runnable() {
        @Override
        public void run() {
            // execute something on the UI thread

            if (curOperation == operationCnt2) {
                // Execution has finished WRAP IT UP
            }

        }
    })
}

Я хочу убедиться, что операция 1 запускается сначала , затем справа после завершения операции 2 запускается . Наконец, я хотел бы иметь возможность запустить некоторый код после того, как оба закончат.

(я хочу, чтобы эти два выполнялись последовательно - строго один за другим)

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

Пожалуйста, пролите немного света.

Спасибо

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Если вам нужно выполнить одну операцию асинхронно, а затем запустить вторую после завершения первой, тогда зачем использовать два Runnables и два почтовых вызова? Вы можете просто объединить их в один.

Если вы хотите запустить первый раз N

post(new Runnable() {
    @Override public void run() {
        for (int i = 0; i < 10; i++) {
            // do operation 1
        }
        for (int i = 0; i < 10; i++) {
            // do operation 2
        }
   }
});

или

post(new Runnable() {
    @Override public void run() {
        for (int i = 0; i < 10; i++) {
            // do operation 1
            // do operation 2
        }
   }
});
0 голосов
/ 16 мая 2018

Не используйте operationCnt для управления потоком подобным образом. Переменная i использование в runner должно быть окончательным.

Вы можете использовать Thread.join() для ожидания:

Runnable r = () -> // do something;
Thread t = new Thread(r);
t.start();
Thread t2 = new Thread(r2);
...
t.join();
t2.join();
t3.join();

// После того, как программа достигла здесь. Все нити t_i закончены. Вы можете начать операцию 2

Если вы не хотите блокировать основной поток, вы можете использовать CompletableFuture:

CompletableFuture.runAsync(() -> your first operation)
.thenRun(() -> Your second operation);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...