Прежде всего, я решил сделать блокировку своего класса (чтобы потребителю было проще пользоваться - но, возможно, мне было бы труднее писать). В противоположность тому, чтобы потребитель определял асинхронные обратные вызовы. Это хороший шаблон дизайна? Таким образом, пользователь может получить ожидаемое поведение, но реализовать собственную многопоточность, если он недоволен тем, как долго блокируется поток.
У меня есть конструктор, который устанавливает конечное поле в классе на основе результата асинхронного обратного вызова c:
class Example {
private final int x;
Example(){
asyncFunc(/* callback */ result -> x = result)
}
}
Это не работает, поэтому я использовал ссылки на atomi c и реализовал блокировку l oop, пока возвращенный результат, вот так:
class Example {
private final int x;
Example(){
x = waitAsyncFunc();
}
private int waitAsyncFunc(){
AtomicBoolean finished = new AtomicBoolean(false);
AtomicReference<byte[]> result = new AtomicReference<>();
asyncFunc(result -> {
result .set(res);
finished.set(true);
});
while (!finished.get()) { /* No op */ }
return result.get();
}
}
Это хороший способ заблокировать / получить результат?