Tobiq:
まず第一に、私は( - しかし、書き込みに私のために多分より多くの退屈な使用への消費者のためにそれを容易にするために)私のクラスには、ブロッキング作ることにしました。消費者を有するのとは対照的に、非同期コールバックを定義します。これは良いデザインパターンですか?このように、ユーザーが予想される動作、しかし、彼らはスレッドのためにブロックされてどのくらいの時間に不満している場合は、独自のマルチスレッドを実装することができます。
私は、非同期コールバックの結果に基づいて、クラス内の最後のフィールドを設定し、コンストラクタを持っています:
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();
}
}
これは、結果を取得/遮断するための良い方法ですか?
ホルガー:
最も簡単な解決策は次のようになります
class Example {
private final int x;
Example() {
CompletableFuture<Integer> f = new CompletableFuture();
asyncFunc(f::complete);
x = f.join();
}
}
しかし、たとえ構築する前に、非同期ジョブの完了を待っているの代替を検討Example
インスタンスを。