Предположим, что я ожидаю выполнения некоторого условия A, как тогда это лучше всего реализовать? У меня на уме 2 варианта, но не знаю, какой из них лучше.
while(!A);
или
while(!A)
Thread.onSpinWait();
Лучше не использовать
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());
Второй вариант.
onSpinWait - Указывает, что вызывающий в данный момент не может прогрессировать, пока не произойдет одно или несколько действий со стороны других действий.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Нужно чтобы строка типа "+ 5 7" делилась на знак, число, числоЗнак любой, число любое