Maison  >  Questions et réponses  >  le corps du texte

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

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

PHPzPHPz2717 Il y a quelques jours466

répondre à tous(7)je répondrai

  • 天蓬老师

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

    La valeur de retour de la méthode est user, cette méthode ne peut donc pas être appelée méthode asynchrone. À moins que cette méthode ne renvoie un futur, ou quelque chose comme une référence pouvant obtenir le résultat plus tard, cette méthode peut être appelée méthode asynchrone. Si vous souhaitez obtenir l'utilisateur après avoir ajusté la méthode, il n'est pas nécessaire de placer du code asynchrone dans la méthode, ce qui n'a aucun sens.

    Les résultats asynchrones ne peuvent être renvoyés que via des rappels.

    La méthode de synchronisation est généralement la suivante

    public User syncGetUser() {
        User user = heavyWork();
        return user;
    }

    Étant donné que la méthode heavyWork peut nécessiter de vérifier la base de données ou d'effectuer de nombreux calculs, la méthode heavyWork prendra beaucoup de temps à s'exécuter.
    Si vous ne voulez pas attendre beaucoup de temps, c'est là que l'asynchrone s'avère utile.

    public Future<User> asyncGetUser() {
        Future<User> future = threadPool.submit(new Callable<User> {
            public User call() throws Exception {
                return heavyWork();
            }
        }
        
        return future;
    }

    À ce stade, heavyWork a été confié à un autre thread pour qu'il s'exécute, et un futur vous est rendu.
    Après cela, vous pouvez obtenir l'utilisateur de votre choix grâce à la méthode get de ce futur.

    C'est le sens et l'utilité de l'asynchrone. Le titre lui-même est contradictoire. Renvoyer le résultat d'une exécution asynchrone dans une méthode contenant du code asynchrone est une contradiction.

    répondre
    0
  • 阿神

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

    Je n'ai pas étudié RxJava, mais mes collègues qui ont fait du développement Android dans l'équipe précédente ont dit que c'était très utile.

    Le 1er étage a donné une solution utilisant Future, mais malheureusement Future est une API de blocage asynchrone, c'est-à-dire qu'il n'y a pas de rappel de notification.

    Quant à la façon d'implémenter les rappels, cela devrait être très basique. Il suffit de regarder le modèle d'observateur. L'essence est d'utiliser les caractéristiques polymorphes de l'interface.

    Mais vous pouvez utiliser Google Guava, qui fournit un Future amélioré appelé ListenableFuture.

    L'exemple du 1er étage est ici cité et modifié.

     class A implements FutureCallback{
            ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
            ListenableFuture futrue = service.submit(new Callable() {
                public User call() {
                    return heavyWork();
                }
            });
            Futures.addCallback(furtrue,this);
    
            public void onSuccess(User user) {
                //这个是回调执行的代码
            }
            public void onFailure(Throwable thrown) {
    
            }
        }

    répondre
    0
  • 大家讲道理

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

    Le "retour" d'une méthode asynchrone se produit avant l'exécution du code. Le code n’a pas encore été exécuté, comment renvoyer le résultat ?

    répondre
    0
  • 怪我咯

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

    Je pense qu'il est également possible d'utiliser la méthode de rappel

    répondre
    0
  • PHP中文网

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

    Utilisez CountDownLatch pour convertir les opérations asynchrones en opérations synchrones.

    loquet final CountDownLatch = new CountDownLatch(1);

    Appelez une méthode asynchrone.

    Dans le résultat du rappel asynchrone,
    latch.countDown();
    Alors

    essayez {

    latch.await();
    

    } catch (InterruptedException e) {

    }


    retourner les données ;

    répondre
    0
  • 伊谢尔伦

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

    Il existe un fil de discussion en Java qui renvoie l'interface Callable

    répondre
    0
  • 阿神

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

    rx.java n'a pas été utilisé
    mais je connais les méthodes sous Android, j'espère que cela vous sera utile.
    D'après ce que vous avez dit, si le résultat de retour asynchrone est utilisé dans la méthode principale, alors la communication entre les threads doit être prise en compte
    C'est-à-dire, écrivez d'abord un gestionnaire, écrivez une méthode pour recevoir des données et exécutez l'exécution souhaitée lorsque les données arrivent, méthode
    puis envoyez les données au gestionnaire une fois le sous-thread terminé.

    répondre
    0
  • Annulerrépondre