异步编程 - 在Java中使用异步后,主方法如何返回异步中得到的值?
PHPz
PHPz 2017-04-18 09:51:32
0
7
489

一个返回值为User的方法,在内部调用了异步方法(比如Rxjava,或者异步的网络请求),其内部匿名函数内才能拿到user对象,那么我的方法应该怎么return这个对象?

PHPz
PHPz

学习是最好的投资!

全員に返信(7)
Peter_Zhu

メソッドの戻り値は user であるため、このメソッドは非同期メソッドとは言えません。このメソッドがフューチャー、または後で結果を取得できる参照のようなものを返さない限り、このメソッドは非同期メソッドと呼ぶことができます。メソッドを調整した後にユーザーを取得したい場合は、メソッドに非同期コードを配置する必要はありませんが、まったく意味がありません。

非同期結果はコールバックを通じてのみ返されます。

同期方法は通常こんな感じです

リーリー

heavyWork メソッドはデータベースのチェックや大量の計算を必要とする場合があるため、heavyWork メソッドの実行には時間がかかります。
長時間待ちたくない場合は、非同期が便利です。

リーリー

この時点で、heavyWork は別のスレッドに渡されて実行され、Future が返されます。
その後、この将来の get メソッドを通じて必要なユーザーを取得できます。

これが非同期の意味と有用性です。タイトル自体が矛盾しています。非同期コードを含むメソッドで非同期実行の結果を返すことは矛盾します。

いいねを押す +0
阿神

私は RxJava を勉強したことはありませんが、前のチームで Android 開発をしていた同僚は、RxJava がとても便利だと言いました。

1階ではFutureを使った解決策を紹介しましたが、残念ながらFutureは非同期ブロッキングAPI、つまり通知コールバックがありません。

コールバックの実装方法については、オブザーバー パターンを見てください。本質は、インターフェイスの多態性の特性を使用することです。

ただし、ListenableFuture と呼ばれる強化された Future を提供する Google guava を使用することもできます。

1階の作例を引用し、修正させていただきました。

リーリー
いいねを押す +0
大家讲道理

非同期メソッドの「リターン」は、コードが実行される前に発生します。コードはまだ実行されていません。結果はどのように返されるのでしょうか?

いいねを押す +0
刘奇

コールバックメソッドを使うことも可能だと思います

いいねを押す +0
洪涛

CountDownLatch を使用して、非同期操作を同期操作に変換します。

最終 CountDownLatch ラッチ = 新しい CountDownLatch(1);

非同期メソッドを呼び出します。

非同期コールバック結果では、
latch.countDown()

それから

{
を試してください リーリー

} catch (InterruptedException e) {

}

データを返す;

いいねを押す +0
伊谢尔伦

Java には Callable インターフェイスを返すスレッドがあります

いいねを押す +0
阿神

rx.java は使用したことがありません
ですが、Android でのメソッドは知っています。お役に立てれば幸いです。
おっしゃるとおり、メインメソッドで非同期の戻り結果を使う場合は、スレッド間の通信を考慮する必要があるとのことです
つまり、ハンドラを先に書いて、データを受け取るメソッドを書いて実行するということになります。データが到着したらメソッド
を実行し、サブスレッドの完了後にデータをハンドラーに送信します。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート