Heim > Java > JavaBase > Einführung in den Java-Callback-Mechanismus

Einführung in den Java-Callback-Mechanismus

Freigeben: 2020-06-17 17:07:32
nach vorne
2436 Leute haben es durchsucht

Einführung in den Java-Callback-Mechanismus

Modulübergreifende Aufrufe

In einem Anwendungssystem muss es, egal welche Sprache für die Entwicklung verwendet wird, vorhanden sein be module Es gibt verschiedene Arten von Aufrufen:

(1) Synchroner Aufruf

Der synchrone Aufruf ist die grundlegendste und einfachste A-Aufrufmethode. Die Methode a() der Klasse A ruft die Methode b() der Klasse B auf. Sie wartet darauf, dass die Ausführung der Methode b() abgeschlossen ist und die Methode a() fortfährt. Diese aufrufende Methode eignet sich für Situationen, in denen die Ausführungszeit der Methode b() nicht lang ist , denn wenn die Ausführungszeit der Methode b() lang ist oder direkt blockiert wird, Der verbleibende Code der Methode a() kann nicht ausgeführt werden, was dazu führt, dass der gesamte Prozess blockiert wird.

(2) Asynchroner Aufruf

Asynchroner Aufruf soll das Problem lösen, das bei synchronen Aufrufen auftreten kann blockiert, was dazu führt, dass eine aufrufende Methode dadurch verursacht wird, dass der gesamte Prozess hängen bleibt. Methode a() der Klasse A ruft Methode b() der Klasse B auf, indem sie einen neuen Thread startet, und der Code führt dann direkt aus, sodass unabhängig von der Ausführungszeit von Methode b () Wie lange dauert es, bis die Ausführung der Methode a() blockiert wird?

Aber auf diese Weise, da Methode a() nicht auf den Abschluss der Ausführung von Methode b() wartet, erfordert Methode a() das Ausführungsergebnis von Methode b() (Abhängig von der spezifischen Situation. Es hängt vom Unternehmen ab. Für einige Unternehmen, z. B. das Starten eines asynchronen Threads zum Senden einer WeChat-Benachrichtigung oder das Aktualisieren eines Caches, ist dies nicht erforderlich.) Das Ausführungsergebnis der Methode b () muss überwacht werden auf eine bestimmte Art und Weise.

(3) Rückruf

Die letzte Idee des Rückrufs ist:

  • Die a()-Methode der Klasse A ruft die b()-Methode der Klasse B auf
  • Die b()-Methode von Klasse B ruft nach der Ausführung aktiv die callback()-Methode von A auf. Eine solche aufrufende Methode bildet das obige Bild, bei dem es sich um ein bidirektionale Aufrufmethode.

Codebeispiel

Als nächstes werfen wir einen Blick auf das Rückrufcodebeispiel. Der Code wird simuliert. Es ist eine solche Szene: Der Lehrer stellt den Schülern eine Frage, und die Schüler antworten dem Lehrer, nachdem sie darüber nachgedacht haben. Definieren Sie zunächst eine Rückrufschnittstelle, die nur eine Methode tellAnswer(int answer) hat, das heißt, der Schüler sagt dem Lehrer nach dem Nachdenken die Antwort:

/**
 * 回调接口,原文出处http://www.cnblogs.com/xrq730/p/6424471.html
 */
public interface Callback {

    public void tellAnswer(int answer);

}
Nach dem Login kopieren

Definieren Sie ein Das Lehrerobjekt implementiert die Callback-Schnittstelle:

/**
 * 老师对象,原文出处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);
    }

}
Nach dem Login kopieren

Das Lehrerobjekt verfügt über zwei öffentliche Methoden:

(1) Callback-Schnittstelle tellAnswer(int Antwort), das heißt, der Schüler hat die Frage beantwortet. Was der Lehrer danach tun muss

(2) Fragemethode stellen askQuestion(), das heißt, dem Schüler eine Frage stellen

Definieren Sie dann natürlich eine Schülerschnittstelle, erhalten Sie jedoch einen Callback-Parameter, damit die Schüler wissen, an wen sie sich nach der Lösung des Problems wenden müssen:

/**
 * 学生接口,原文出处http://www.cnblogs.com/xrq730/p/6424471.html
 */
public interface Student {

    public void resolveQuestion(Callback callback);

}
Nach dem Login kopieren

Definieren Sie abschließend einen bestimmten Schüler namens 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);
    }

}
Nach dem Login kopieren

Nachdem das Problem gelöst wurde, meldet Zeile 16 die Antwort an den Lehrer.

Schreiben Sie eine Testklasse, die relativ einfach ist:

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

    }

}
Nach dem Login kopieren

Das Ergebnis der Codeausführung ist nur eine Zeile:

<span style="color: #000000;">知道了,你的答案是3<br></span>
Nach dem Login kopieren

Fassen Sie kurz zusammen und analysieren Sie dieses Beispiel. Das heißt:

(1) Der Lehrer ruft die Methode „resolveQuestion“ der Schülerschnittstelle auf und stellt dem Schüler eine Frage

(2) Nachdem der Schüler das Problem gelöst hat , nennt er die Rückrufmethode des Lehrers tellAnswer

Eine solche Reihe von Prozessen stellt eine bidirektionale Aufrufbeziehung dar.


Code-Analyse

Analysieren Sie den obigen Code. Ich habe zwei Abstraktionsebenen für den obigen Code erstellt:

( 1) Den Lehrer abstrahieren Nach dem Abstrahieren des Lehrers müssen sich die Schüler nicht darum kümmern, welcher Lehrer mir die Frage gestellt hat, solange ich die Antwort auf der Grundlage der gestellten Frage erhalte, und dann einfach Sagen Sie es dem Lehrer, der die Frage gestellt hat. Auch wenn der Lehrer immer wieder wechselt, wird es keine Auswirkungen auf meine Schüler haben

(2) Abstrahieren Sie die Schüler

  • Nachdem die Schüler abstrahiert wurden, ist es für den Lehrer sehr flexibel, da der Lehrer möglicherweise nicht nur einem Schüler, sondern drei Schülern gleichzeitig Fragen stellt: Ricky, Jack und Lucy dass die Mitglieder sein können. Ändern Sie die Variable „Student“ in „List“, sodass Sie beim Stellen von Fragen die Liste „Student“ durchlaufen können, um Fragen zu stellen, und dann die Antworten von jedem Studenten erhalten

Dieses Beispiel ist ein typisches Beispiel, das die Rolle der Schnittstelle widerspiegelt, weil ich denke, dass einige Freunde die Vorteile von Schnittstellen nicht verstehen, sich auf dieses Beispiel konzentrieren können, um mehr zu verstehen .

Zusammenfassend lässt sich sagen, dass der Kern des Rückrufs darin besteht, dass der Rückrufteilnehmer sich selbst an den Anrufer weitergibt , damit der Anrufer es erkennen kann Der Rückruf erhält nach Beendigung des Anrufs die Informationen, die er wissen möchte. Callback ist eine Idee und ein Mechanismus. Wie man Callback elegant und mit hoher Skalierbarkeit durch Code implementiert, hängt von der persönlichen Ebene des Entwicklers und seinem Geschäftsverständnis ab.

Synchrone Rückrufe und asynchrone Rückrufe

Im obigen Beispiel könnte jemand diese Frage stellen:

Welcher Rückruf wird für dieses Beispiel benötigt? Wäre es bei synchronem Aufruf nicht großartig, wenn das Schülerobjekt die Frage beantwortet und die Antwort direkt an das Lehrerobjekt zurückgibt?

Es ist nichts Falsches daran, diese Frage zu stellen. Diese Frage kann aus zwei Perspektiven verstanden werden.

Was ist, wenn der Lehrer nicht nur Antworten von den Schülern möchte?

Vielleicht ist dieser Lehrer ein Lehrer, der lieber die Ideen der Schüler zur Problemlösung hört, bevor er die Antworten der Schüler erhält. Natürlich möchte er die Namen und Lösungsideen der Schüler erfahren , manche Leute können das sagen, dann kann ich es. Wäre es nicht schön, ein Objekt zu definieren und den Namen des Schülers und Lösungsideen hinzuzufügen? Meiner Meinung nach gibt es zwei Probleme mit dieser Aussage:

(1) Wenn der Lehrer immer mehr Daten möchte, müssen die zurückgegebenen Objekte immer größer werden, und die Verwendung von Rückrufen kann die Daten in einem Stapel trennen Welche Daten in der Rückrufmethode verarbeitet werden, hängt vom jeweiligen Unternehmen ab. Wenn Sie Rückgabeparameter hinzufügen müssen, fügen Sie diese einfach direkt in der Rückrufmethode hinzu

(2) Das Problem kann nicht gelöst werden Der Lehrer möchte den Namen des Schülers erhalten, die Lösungsidee des Schülers geht der Antwort des Schülers voraus

Daher denke ich, dass es nicht nötig ist, Rückrufe zu verwenden, um einfach ein bestimmtes Ergebnis zurückzugeben, und Sie können direkt synchrone Aufrufe verwenden, aber wenn es welche gibt Es gibt mehrere Arten von Daten, die verarbeitet werden müssen, und die Daten werden in Primär- und Sekundärdaten unterteilt. Daher wäre die Verwendung von Rückrufen eine geeignetere Wahl. Priorisierte Daten sollten zuerst in der Rückrufmethode verarbeitet werden.

Ein anderer Verständniswinkel ist wichtiger, nämlich der im Titel erwähnte synchrone Rückruf und asynchrone Rückruf. Das Beispiel ist ein synchroner Rückruf, was bedeutet, dass der Lehrer Ricky eine Frage stellt, Ricky die Antwort gibt, der Lehrer den nächsten Klassenkameraden fragt und, nachdem er die Antwort erhalten hat, den nächsten Klassenkameraden weiter fragt. Dies ist ein normales Szenario, aber wenn Ich ändere das Szenario. Als Nächstes:

Der Lehrer wollte keine Einzelfragen stellen, sondern fragte fünf Schüler gleichzeitig: Ricky, Mike, Lucy, Bruce und Kate Lassen Sie die Schüler selbst darüber nachdenken, welcher Schüler denken soll. Wenn Sie fertig sind, teilen Sie dem Lehrer einfach die Antwort mit.

Dieses Szenario ist gleichbedeutend mit der Aussage, dass die Schüler, nachdem sie mit dem Nachdenken über das Problem fertig sind, eine Möglichkeit benötigen, es dem Lehrer mitzuteilen. Es gibt zwei Lösungen:

(1 ) Verwenden Sie die Future+Callable-Methode und warten Sie auf das Ergebnis der asynchronen Thread-Ausführung, was einer Variante des synchronen Aufrufs entspricht, da ihr Kern darin besteht, dass die Methode ein Ergebnis zurückgibt, d. h. die Antwort des Schülers

(2 ) Mithilfe des asynchronen Rückrufs beendet der Schüler die Beantwortung der Frage. Rufen Sie einfach die Rückrufschnittstellenmethode auf und teilen Sie dem Lehrer die Antwort mit. Da das Lehrerobjekt in die Callback-Schnittstelle abstrahiert ist, weist dieser Ansatz eine sehr gute Skalierbarkeit auf. Selbst wenn sich der Lehrer nacheinander ändert, ist das Einzige, was für die Schüler wichtig ist, der Aufruf der Callback-Schnittstelle Notwendige Informationen

Weitere Informationen finden Sie in der Spalte Java Basic Tutorial

Das obige ist der detaillierte Inhalt vonEinführung in den Java-Callback-Mechanismus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:cnblogs.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage