Maison  >  Article  >  Java  >  Introduction au mécanisme de rappel Java

Introduction au mécanisme de rappel Java

尚
avant
2020-06-17 17:06:342382parcourir

Introduction au mécanisme de rappel Java

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 :

  • La méthode a() de la classe A appelle la méthode b() de la classe B
  • La méthode b() de la classe B appelle activement la classe après l'exécution. La méthode callback() de A

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 :


(1) Interface de rappel tellAnswer(int réponse), c'est-à-dire que l'élève a répondu à la question. Après cela, ce que l'enseignant doit faire

(2) poser la méthode de question AskQuestion(), c'est-à-dire poser une question à l'élève

Définissez ensuite une interface étudiant. L'étudiant résoudra bien sûr le problème, mais recevra un paramètre de rappel, afin que les étudiants sachent à qui se rapporter après avoir résolu le problème :

/**
 * 学生接口,原文出处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.


Écrivez une classe de test, qui est relativement simple :

/**
 * 回调测试,原文出处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 :


(1) L'enseignant appelle la méthode solveQuestion de l'interface étudiant et pose une question à l'élève

(2) Une fois que l'élève a résolu le problème , il appelle la méthode de rappel de l'enseignant tellAnswer

Un tel ensemble de processus constitue une relation d'appel bidirectionnelle.

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'enseignant

    Après avoir résumé l'enseignant, les élèves n'ont pas besoin de se soucier de savoir quel enseignant m'a posé la question, tant que j'obtiens la réponse en fonction de la question posée, et ensuite simplement. dites-le au professeur qui a posé la question. Même si le professeur change encore et encore, cela n'aura aucun impact sur mes élèves
(2) Abstraction des élèves

  • Une fois les élèves résumés, c'est très flexible pour l'enseignant, car l'enseignant ne pose pas nécessairement de questions à un élève, mais peut poser des questions à Ricky, Jack et Lucy en même temps, de sorte que les membres peuvent être Changez la variable Student en List, de sorte que lorsque vous posez des questions, vous puissiez parcourir la liste des étudiants pour poser des questions, puis obtenir les réponses de chaque étudiant

Cet 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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer