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

Einführung in den Java-Callback-Mechanismus

Jun 17, 2020 pm 05:06 PM
java

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!

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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Quadratwurzel in Java Quadratwurzel in Java Aug 30, 2024 pm 04:26 PM

Leitfaden zur Quadratwurzel in Java. Hier diskutieren wir anhand eines Beispiels und seiner Code-Implementierung, wie Quadratwurzel in Java funktioniert.

Perfekte Zahl in Java Perfekte Zahl in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur perfekten Zahl in Java. Hier besprechen wir die Definition, Wie prüft man die perfekte Zahl in Java?, Beispiele mit Code-Implementierung.

Zufallszahlengenerator in Java Zufallszahlengenerator in Java Aug 30, 2024 pm 04:27 PM

Leitfaden zum Zufallszahlengenerator in Java. Hier besprechen wir Funktionen in Java anhand von Beispielen und zwei verschiedene Generatoren anhand ihrer Beispiele.

Armstrong-Zahl in Java Armstrong-Zahl in Java Aug 30, 2024 pm 04:26 PM

Leitfaden zur Armstrong-Zahl in Java. Hier besprechen wir eine Einführung in die Armstrong-Zahl in Java zusammen mit einem Teil des Codes.

Weka in Java Weka in Java Aug 30, 2024 pm 04:28 PM

Leitfaden für Weka in Java. Hier besprechen wir die Einführung, die Verwendung von Weka Java, die Art der Plattform und die Vorteile anhand von Beispielen.

Smith-Nummer in Java Smith-Nummer in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

Fragen zum Java Spring-Interview Fragen zum Java Spring-Interview Aug 30, 2024 pm 04:29 PM

In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

Brechen oder aus Java 8 Stream foreach zurückkehren? Brechen oder aus Java 8 Stream foreach zurückkehren? Feb 07, 2025 pm 12:09 PM

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

See all articles