ホームページ  >  に質問  >  本文

异步编程 - 在Java中使用异步后,主方法如何返回异步中得到的值?

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

PHPzPHPz2717日前465

全員に返信(7)返信します

  • 天蓬老师

    天蓬老师2017-04-18 09:53:32

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

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

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

    リーリー

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

    リーリー

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

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

    返事
    0
  • 阿神

    阿神2017-04-18 09:53:32

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

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

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

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

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

    リーリー

    返事
    0
  • 大家讲道理

    大家讲道理2017-04-18 09:53:32

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

    返事
    0
  • 怪我咯

    怪我咯2017-04-18 09:53:32

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

    返事
    0
  • PHP中文网

    PHP中文网2017-04-18 09:53:32

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

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

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

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

    それから

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

    } catch (InterruptedException e) {

    }

    データを返す;

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 09:53:32

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

    返事
    0
  • 阿神

    阿神2017-04-18 09:53:32

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

    返事
    0
  • キャンセル返事