찾다

 >  Q&A  >  본문

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

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

PHPzPHPz2766일 전491

모든 응답(7)나는 대답할 것이다

  • 天蓬老师

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

    메서드의 반환 값은 user이므로 이 메서드는 비동기 메서드라고 할 수 없습니다. 이 메서드가 미래를 반환하거나 나중에 결과를 얻을 수 있는 참조와 같은 것을 반환하지 않는 한 이 메서드를 비동기 메서드라고 부를 수 있습니다. 메서드를 조정한 후 사용자를 얻으려면 메서드에 비동기 코드를 배치할 필요가 없으며 이는 전혀 의미가 없습니다.

    비동기 결과는 콜백을 통해서만 반환될 수 있습니다.

    동기화 방법은 보통 이렇습니다

    으아아아

    heavyWork 메소드는 데이터베이스를 확인해야 하거나 많은 계산을 해야 하기 때문에, HeavyWork 메소드를 실행하는 데 많은 시간이 소요됩니다.
    오랜 시간을 기다리지 않으려면 비동기식을 사용하는 것이 좋습니다.

    으아아아

    이 시점에서 HeavyWork는 다른 스레드에 넘겨져 실행되고 미래가 사용자에게 반환됩니다.
    이후에는 이 future의 get 메소드를 통해 원하는 사용자를 얻을 수 있습니다.

    이것이 비동기의 의미이자 유용성입니다. 제목 자체가 모순적이네요. 비동기 코드가 포함된 메서드에서 비동기 실행 결과를 반환하는 것은 모순입니다.

    회신하다
    0
  • 阿神

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

    저는 RxJava를 공부해본 적이 없는데 이전 팀에서 Android 개발을 했던 동료들이 매우 유용하다고 하더군요.

    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는 사용되지 않았습니다
    하지만 안드로이드의 메소드를 알고 있으니 도움이 되셨으면 좋겠습니다.
    말씀하신 대로 메인 메소드에서 비동기 반환 결과를 사용한다면 스레드 간의 통신을 고려해야 합니다
    즉, 핸들러를 먼저 작성하고, 데이터를 수신할 메소드를 작성하고, 데이터가 오면
    메서드를 실행하고 하위 스레드가 완료된 후 핸들러에 데이터를 보냅니다.

    회신하다
    0
  • 취소회신하다