Как лучше всего ожидать выполнения некоторого условия?

120
25 марта 2021, 13:30

Предположим, что я ожидаю выполнения некоторого условия A, как тогда это лучше всего реализовать? У меня на уме 2 варианта, но не знаю, какой из них лучше.

while(!A);

или

while(!A)
   Thread.onSpinWait();
Answer 1

Лучше не использовать

while(!A);

т.к. в таком случае процессор не может распознать, что здесь подразумается ожидание и будет выполнять пустую операцию. Т.е. ты до выполнения своего условия возможно получишь 100% загрузки на одном ядре, что не лучший вариант.

Вариант

while(!A)
   Thread.onSpinWait();

немного лучше, но тоже плох, т.к. всё равно много пустых проверок.

Возможно вам стоит посмотреть в сторону триггерной модели. К примеру, с помощью CompletableFuture. В одном потоке вы создаёте этот CompletableFuture, далее передаёте его, но в виде Future в другой поток, и запускаете этот другой поток. Грубо это может выглядеть вот так:

CompletableFuture<Object> future = new CompletableFuture<Object>();
new Thread(() -> {
    try {
        //....
        future.get(); //это вместо while
        //....
    } catch (Exception e) {
        e.printStackTrace();
    }
}).start();
//.....
future.complete(new Object());
Answer 2

Второй вариант.

onSpinWait​ - Указывает, что вызывающий в данный момент не может прогрессировать, пока не произойдет одно или несколько действий со стороны других действий.