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) {
}
}
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é.
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
É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.
À 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é.
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,
essayez {latch.countDown();
Alors
} 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é.