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

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

PHPz
PHPz

学习是最好的投资!

répondre à tous(7)
Peter_Zhu

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.

阿神

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) {

        }
    }
大家讲道理

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 ?

刘奇

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

洪涛

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 ;

伊谢尔伦

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

阿神

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é.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!