Appels inter-modules
Dans un système d'application, quel que soit le langage utilisé pour le développement, il doit be modules Il existe plusieurs types d'appels :
(1) Appel synchrone
L'appel synchrone est la méthode d'appel A la plus basique et la plus simple. La méthode a() de la classe A appelle la méthode b() de la classe B. Elle attend que la méthode b() termine son exécution et que la méthode a() continue. Cette méthode d'appel convient aux situations où le temps d'exécution de la méthode b() n'est pas long , car si le temps d'exécution de la méthode b() est long ou qu'elle est directement bloquée, le code restant de la méthode a() Il ne peut pas être exécuté, ce qui entraînera le blocage de l'ensemble du processus.
(2) Appel asynchrone
L'appel asynchrone vise à résoudre le problème que les appels synchrones peuvent être bloqué, ce qui entraîne le blocage d'une méthode d'appel provoquée par l'ensemble du processus. La méthode a() de la classe A appelle la méthode b() de la classe B en démarrant un nouveau thread, et le code s'exécute ensuite directement , donc quel que soit le temps d'exécution de la méthode b( ) Combien de temps faudra-t-il pour que l'exécution de la méthode a() soit bloquée ?
Mais de cette façon, puisque la méthode a() n'attend pas la fin de l'exécution de la méthode b(), lorsque la méthode a() nécessite le résultat de l'exécution de la méthode b() (selon la situation spécifique, cela dépend de l'entreprise. Pour certaines entreprises, comme démarrer un thread asynchrone pour envoyer une notification WeChat ou actualiser un cache, cela n'est pas nécessaire.) Le résultat de l'exécution de la méthode b() doit être surveillé dans d'une certaine manière.
(3) Rappel
Le dernier est le rappel L'idée du rappel est :
Une telle méthode d'appel forme l'image ci-dessus, qui est un méthode d'appel bidirectionnelle.
Exemple de code
Ensuite, jetons un coup d'œil à l'exemple de code de rappel, le code est simulé C'est une telle scène : le professeur pose une question aux élèves, et les élèves répondent au professeur après y avoir réfléchi.
Définissez d'abord une interface de rappel, qui n'a qu'une seule méthode tellAnswer(int réponse), c'est-à-dire que l'élève donne la réponse à l'enseignant après avoir réfléchi :
/** * 回调接口,原文出处http://www.cnblogs.com/xrq730/p/6424471.html */ public interface Callback { public void tellAnswer(int answer); }
Définir un L'objet enseignant implémente l'interface de rappel :
/** * 老师对象,原文出处http://www.cnblogs.com/xrq730/p/6424471.html */ public class Teacher implements Callback { private Student student; public Teacher(Student student) { this.student = student; } public void askQuestion() { student.resolveQuestion(this); } @Override public void tellAnswer(int answer) { System.out.println("知道了,你的答案是" + answer); } }L'objet enseignant a deux méthodes publiques :
/** * 学生接口,原文出处http://www.cnblogs.com/xrq730/p/6424471.html */ public interface Student { public void resolveQuestion(Callback callback); }Enfin, définissez un étudiant spécifique nommé Ricky. :
/** * 一个名叫Ricky的同学解决老师提出的问题,原文出处http://www.cnblogs.com/xrq730/p/6424471.html */ public class Ricky implements Student { @Override public void resolveQuestion(Callback callback) { // 模拟解决问题 try { Thread.sleep(3000); } catch (InterruptedException e) { } // 回调,告诉老师作业写了多久 callback.tellAnswer(3); } }Après avoir résolu le problème, la ligne 16 rapporte la réponse au professeur.
/** * 回调测试,原文出处http://www.cnblogs.com/xrq730/p/6424471.html */ public class CallbackTest { @Test public void testCallback() { Student student = new Ricky(); Teacher teacher = new Teacher(student); teacher.askQuestion(); } }
Le résultat de l'exécution du code n'est qu'une seule ligne :
<span style="color: #000000;">知道了,你的答案是3<br></span>Résumez brièvement et analysez cet exemple C'est-à-dire :
Analyse du code
Analyser le code ci-dessus J'ai fait deux niveaux d'abstraction pour le code ci-dessus : ( 1) Résumé de l'enseignantCet exemple est un exemple typique qui reflète le rôle de l'interface. La raison pour laquelle je dis cela est parce que je pense que certains amis peuvent ne pas comprendre les avantages des interfaces. Les amis qui ne comprennent pas les avantages des interfaces peuvent se concentrer sur cet exemple pour en comprendre davantage.
Pour résumer, le cœur du rappel est que la partie de rappel se transmet, ceci, à l'appelant , afin que l'appelant puisse le savoir le rappel une fois l'appel terminé les informations qu'il souhaite connaître. Le rappel est une idée et un mécanisme. Quant à la façon de le mettre en œuvre, la façon de le mettre en œuvre avec élégance et avec une grande évolutivité via le code dépend du niveau personnel du développeur et de sa compréhension de l'entreprise.
Rappels synchrones et rappels asynchrones
Dans l'exemple ci-dessus, quelqu'un peut poser cette question :
Quel rappel est nécessaire pour cet exemple ? En utilisant l'appel synchrone, ne serait-il pas formidable que l'objet étudiant réponde à la question et renvoie directement la réponse à l'objet enseignant ?
Il n'y a rien de mal à soulever cette question. Cette question peut être comprise sous deux angles.
Tout d’abord, que se passe-t-il si l’enseignant ne veut pas seulement des réponses des élèves ?
Peut-être que cet enseignant est un enseignant qui préfère écouter les idées de résolution de problèmes des élèves. Avant d'obtenir les réponses des élèves, l'enseignant aimerait connaître les noms des élèves et leurs idées de résolution de problèmes. Bien sûr, certaines personnes peuvent dire cela, alors je peux. Ne serait-il pas bien de définir un objet et d'ajouter le nom de l'élève et ses idées de solutions ? À mon avis, cette affirmation pose deux problèmes :
(1) Si l'enseignant veut de plus en plus de données, les objets renvoyés doivent être de plus en plus grands, et l'utilisation de rappels peut séparer les données. de données dans la méthode de rappel pour le traitement. Quant aux données qui dépendent de l'entreprise spécifique, si vous devez ajouter des paramètres de retour, ajoutez-les simplement directement dans la méthode de rappel
(2) Impossible de résoudre le problème. l'enseignant veut obtenir le nom des élèves, l'idée de solution de l'élève précède la réponse de l'élève
Par conséquent, je pense qu'il n'est pas nécessaire d'utiliser des rappels pour simplement renvoyer un certain résultat et vous pouvez directement utiliser des appels synchrones, mais s'il y en a plusieurs types de données doivent être traitées et les données sont classées en données primaires et secondaires, donc l'utilisation de rappels serait un choix plus approprié. Les données prioritaires doivent être traitées en premier dans la méthode de rappel.
Un autre angle de compréhension est plus important, à savoir le rappel synchrone et le rappel asynchrone mentionnés dans le titre. L'exemple est un rappel synchrone, ce qui signifie que l'enseignant pose une question à Ricky, Ricky donne la réponse, l'enseignant demande au prochain camarade de classe et, après avoir obtenu la réponse, continue de poser la question au prochain camarade de classe. C'est un scénario normal, mais si. Je change de scénario Suivant :
Le professeur ne voulait pas poser de questions comme une par une, mais a posé des questions à cinq élèves, Ricky, Mike, Lucy, Bruce et Kate, en même temps. , laissant les élèves réfléchir par eux-mêmes, quel élève devrait penser. Lorsque vous avez terminé, dites simplement la réponse directement à l'enseignant.
Ce scénario équivaut à dire qu'une fois que les élèves ont fini de réfléchir au problème, ils ont besoin d'un moyen de le dire à l'enseignant. Il existe deux solutions :
(1. ) Utilisez la méthode Future+Callable, en attendant le résultat de l'exécution du thread asynchrone, ce qui équivaut à une variante d'appel synchrone, car son essence est que la méthode renvoie un résultat, c'est-à-dire la réponse de l'étudiant
(2 ) Grâce au rappel asynchrone, l'élève finit de répondre à la question, appelle simplement la méthode de l'interface de rappel et indique la réponse à l'enseignant. Étant donné que l'objet enseignant est abstrait dans l'interface de rappel, cette approche a une très bonne évolutivité, comme mentionné précédemment, même si l'enseignant change l'un après l'autre, pour les étudiants, la seule chose qui les intéresse est d'appeler l'interface de rappel. informations nécessaires
Pour plus de connaissances connexes, veuillez faire attention à la colonne Tutoriel de base Java
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!