【发布时间】:2023-03-21 22:14:01
【问题描述】:
首先,我决定让我的类阻塞(让消费者更容易使用 - 但可能对我来说更乏味)。与让消费者定义异步回调相反。这是一个好的设计模式吗?这样,用户可以获得预期的行为,但如果他们对线程阻塞的时间不满意,可以实现自己的多线程。
我有一个构造函数,它根据异步回调的结果在类中设置最终字段:
class Example {
private final int x;
Example(){
asyncFunc(/* callback */ result -> x = result)
}
}
这不起作用,所以我使用了原子引用,并实现了一个阻塞循环,直到它返回结果,如下所示:
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();
}
}
这是阻止/检索结果的好方法吗?
【问题讨论】:
-
您可以使用 CountDownLatch (stackoverflow.com/questions/17827022/…),而不是使用 AtomicBoolean 等待线程完成。基本上,您定义了一个锁存器,它必须多久倒计时一次。使用 await 您可以暂停线程,直到闩锁倒计时到 0。
-
为什么必须在示例类中等待结果?
-
只是一个例子@You'reawesome。在我的实际课程中,(阻塞和异步)方法都在我的课程中
-
一般来说,我认为在 lambda 中重新分配变量不是一个好主意。我会创建另一个异步函数来处理
asyncFunc返回的结果 -
@You'reawesome 我不明白你的意思
标签: java multithreading concurrency