[JAVA] Überprüfen Sie die Funktion der Schnittstelle über den Thread

Ich war schon lange nicht mehr hungrig nach Java-Schnittstellen. Dafür gibt es mehrere Gründe, aber einer ist, dass es schwierig ist zu verstehen, wo die in der Implementierungsklasse der Schnittstelle beschriebene Methode ausgeführt wird. Versuchen wir also herauszufinden, wo mit einem einfachen Programm ausgeführt werden soll. Das erste Programm, das ich schrieb, war eine Java-Animation, und ich habe mich damals gefragt, ob ich Threads verwenden soll. Beginnen wir von dort aus (es ist möglicherweise nicht sehr Java-ähnlich, da viele Websites, auf denen Java verwendet wird, keine Pick-ups wie Animationen zu sein scheinen). Ich berühre den Faden selbst nicht wirklich. Ich dachte, dass die Erklärung auf den folgenden Seiten, auf die ich in diesem Artikel verwiesen habe, leicht zu verstehen ist. → Verwendung von Threads Die Vorteile der Verwendung der ** Schnittstelle ** werden ebenfalls nicht erwähnt.

Eine unwesentliche abstrakte Methode (Schnittstelle) ・ [Wo ist es implementiert](# Wo ist es implementiert), ・ [Welche Art von Setup](#Welche Art von Setup ist das), ・ Wer (welches Objekt)Zu welchem Zeitpunkt ·Lauf Überprüfen Sie, ob.

Stichwort: Abstrakte Methoden, Strategiemuster (Strategie, ConcreteStrategy, Context, Client), Delegate, Upcast, Ausführungsobjekte

Inhalt des Beispielprogramms

Wenn es um anständige Animationen geht, kann der Fokus nicht auf die Benutzeroberfläche gerichtet werden, also ein Programm, das nur ausgegeben wird, während das "○" nach und nach auf der Konsole verschoben wird. Vor dem "○" in der Endlosschleife des Threads wird wiederholt ein Leerzeichen hinzugefügt und ausgegeben.

Behandelt 4 Klassen (Schnittstellen)

Klasse, Schnittstelle Inhalt
Ausführbare Schnittstelle Da es sich um eine Standard-Java-Schnittstelle handelt, gibt es keinen Quellcode.
VerySimpleTextAnimation-Klasse Implementierungsklasse für ausführbare Schnittstellen
VerySimpleTextAnimationApp-Klasse Führen Sie die Main-Methode aus
Thread-Klasse Da es sich um eine Standard-Java-Schnittstelle handelt, gibt es keinen Quellcode.

VerySimpleTextAnimationApp.java


/* 
 *Nur Hauptmethode
 *Erstellen Sie eine Instanz einer Klasse, die die Runnable-Schnittstelle implementiert
 *Geben Sie diese Instanz im Konstruktor der Thread-Klasse an
 *Erstellen Sie eine Instanz (einen Thread) von Thread.
 *Thread-Instanz-Methodenstart()Ausführen.
 */

public class VerySimpleTextAnimationApp {

	public static void main(String args[]){
		
		/*Erstellen Sie ein Objekt, das als separater Thread fungiert*/
		VerySimpleTextAnimation verySimpleTextAnimation = new VerySimpleTextAnimation();
		
		/*Erstellen Sie einen weiteren Thread und starten Sie den Thread*/
		Thread thread = new Thread(verySimpleTextAnimation);
		thread.start();			
	 }

}

VerySimpleTextAnimation.java



/* 
 *Implementierungsklasse der Runnable-Schnittstelle.
 * Run()Implementieren Sie die Methode.
 *Animation, die ○ allmählich nach rechts bewegt (Absicht)
 */

public class VerySimpleTextAnimation implements Runnable {

	String x = "○";

	public void run() {
		while(true) {
			x = " " + x;
			System.out.println(x);
			try {
				/*Warte ein wenig*/
				Thread.sleep(500);			
			} catch(InterruptedException e) {}			
		}
	}
}

Wo es umgesetzt wird


	public void run() {
		while(true) {
			x = " " + x;
			System.out.println(x);
			try {
				/*Warte ein wenig*/
				Thread.sleep(500);			
			} catch(InterruptedException e) {}			
		}
	}

Innerhalb der VerySimpleTextAnimation-Klasse. Ich implementiere die run-Methode (), die nur in der Runnable-Schnittstelle definiert ist. Ich denke nicht, dass das so schwierig ist. Ich fühle mich jedoch mit den folgenden Punkten im Implementierungsinhalt unwohl.

Thread.sleep(500);

Warum ist es eine statische Methode? Ich werde später auf meine eigene Weise darüber nachdenken. [Über # Thread.sleep ()](Über # Thread.sleep ())

Was ist das für ein Setup?

Schauen wir uns als nächstes die VerySimpleTextAnimationApp an. Zunächst wird eine Instanz der VerySimpleTextAnimation-Klasse (Runnable Interface Implementation Class) erstellt. Eine Klasse, die die zuvor gesehene Ausführungsmethode implementiert.


VerySimpleTextAnimation verySimpleTextAnimation = new VerySimpleTextAnimation();

Übrigens funktioniert es auch, wenn Sie wie folgt schreiben.

Runnable verySimpleTextAnimation = new VerySimpleTextAnimation();

Diese Schreibweise wird Upcast genannt. Wie ich oft sehe, war dies auch ein Stolperstein für mich, deshalb habe ich es früher in einem Artikel geschrieben. Upcast und Super Type / Sub Type

Ich denke, dass die Schwierigkeit beim Anschließen der Schnittstelle darin besteht, dass es viele Fälle gibt, in denen mehrere Elemente in der Verwendungssituation auf komplexe Weise kombiniert werden.

Thread thread = new Thread(verySimpleTextAnimation);

Es ist auch möglich, ** neuen Klassennamen ** direkt in das Argument zu schreiben, ohne eine Instanz der Schnittstellenimplementierungsklasse als Variable zu deklarieren.

Thread thread = new Thread(new VerySimpleTextAnimation());

Erstellen Sie hier eine Instanz der Thread-Klasse. Zu diesem Zeitpunkt ist die zuvor erstellte sehr einfache Textanimation im Argument des Konstruktors enthalten, aber wie lautet der Typ dieses Arguments überhaupt?

Schauen wir uns also den Thread-Klassenkonstruktor in der Java-Dokumentation an.

public Thread(Runnable target) Parameter: target - Ein Objekt, das die Ausführungsmethode enthält, die beim Starten dieses Threads aufgerufen wird.

** Definiert, um eine Instanz (Ziel) vom Typ Runnable als Argument zu verwenden **. In der Parameterbeschreibung steht außerdem ** ein Objekt, das die Ausführungsmethode enthält **. Dieses Mal ist verySimpleTextAnimation im Argument des Thread-Konstruktors enthalten. Die Ausführungsmethode **, die diese Instanz enthält **, ist eine gefälschte Animation, die hier implementiert ist. Ich fühlte mich ziemlich unwohl mit der ** -Methode, die den Schnittstellentyp im Argument definiert, wie diesem Konstruktor. Ich habe die Bedeutung der Verwendung einer abstrakten Methode als Argument nicht verstanden, und die Schnittstelle selbst hätte überhaupt nicht instanziiert werden dürfen. Dies betrifft den zuvor erwähnten Upcast. Wenn das Argument einer Methode vom Typ interface ist, soll es eine Implementierungsklasseninstanz dieser Schnittstelle sein. Ich brauchte einige Zeit, um das zu bemerken.

thread.start();			

Schauen Sie sich die Methode start () in der Dokumentation an

public void start() Startet diesen Thread. Die Java Virtual Machine ruft die Ausführungsmethode dieses Threads auf.

Es heißt ** Aufruf der Ausführungsmethode dieses Threads **. Es heißt ** Delegate ** und vertraut den spezifischen Verarbeitungsinhalt der Ausführungsmethode an.

Schauen wir uns also die Erklärung der run () -Methode an.

public void run() Wenn dieser Thread mit einem separaten Runnable-Ausführungsobjekt erstellt wurde, wird die Ausführungsmethode dieses Runnable-Objekts aufgerufen.

** Wenn mit einem separaten ausführbaren Ausführungsobjekt erstellt ** sollte dies der Fall sein, wenn die Instanz mit einem im Konstruktor angegebenen Ziel vom Typ ausführbar erstellt wurde. run () wird von der Methode start () ausgeführt. Der Inhalt der run () -Methode ist der Inhalt, der in der vom Konstruktor eingegebenen Instanz implementiert ist. Interessant ist übrigens der Name ** Runnable Execution Object **. Rufen Sie so eine Instanz der Schnittstellenimplementierungsklasse auf?

Wer (welches Objekt)

VerySimpleTextAnimationApp-Klasse

Zu welchem Zeitpunkt

Wenn thread.start () in der Main-Methode aufgerufen wird. In diesem Beispiel ist es einfach, den Ausführungszeitpunkt zu verfolgen, aber es ist besser, den guten Zeitpunkt dem Client zu überlassen (siehe [Strategiemustertabelle](# Strategiemuster)), der das Ausführungsobjekt anvertraut hat, z. B. Ereignisverarbeitung und asynchrone Verarbeitung.

Andere

Strategiemuster

Die Struktur der Klasse ist in Bezug auf das Strategiemuster wie folgt.

Rolle Klasse, Schnittstelle Inhalt
Strategy(Strategie) Ausführbare Schnittstelle Da es sich um eine Standard-Java-Schnittstelle handelt, gibt es keinen Quellcode.
ConcreteStrategy(Spezifische Strategie) VerySimpleTextAnimation-Klasse Implementierungsklasse für ausführbare Schnittstellen
Context(Situationsbeurteilung) VerySimpleTextAnimationApp-Klasse Führen Sie die Main-Methode aus
Client(Nutzer) Thread-Klasse Da es sich um eine Standard-Java-Schnittstelle handelt, gibt es keinen Quellcode.

Referenz: Strategiemuster Da der Inhalt dieses Artikels keine strategieähnlichen Dinge berücksichtigt, ist es sehr zweifelhaft, ob es als Strategiemuster bezeichnet werden kann. Da es jedoch dieselbe Form hat, ist es einfach anzuwenden, wenn sich ein solches Muster in meinem Kopfwinkel befindet. Kann werden. Sie müssen dem Code folgen, um den Inhalt des Programms zu verstehen. Es ist leicht zu folgen, wenn Sie den Akkorden linear, tief und tief folgen, aber bis Sie sich daran gewöhnt haben, werden Sie durch wiederholtes Hin- und Herbewegen durcheinander gebracht, und Ihre Konzentration wird verringert. Ich bin der Meinung, dass der einzige Weg, dies zu überwinden, darin besteht, sich daran zu gewöhnen, aber ich denke, dass das Verstehen des Entwurfsmusters die Aussichten verbessern wird (obwohl es schwer zu verstehen ist).

Über Thread.sleep ()

Informationen zur Schlafverarbeitung der Java-Thread-Klasse Ich verstehe das Unbehagen dieses Fragestellers, und für mich löst die Antwort hier es nicht. Es scheint seltsam, dass die Ausführungsanweisung der statischen Methode den Betrieb jeder einzelnen Instanz steuert. Schließlich kenne ich den genauen Grund nicht, aber wahrscheinlich, weil diese statische Methode für einzelne Instanzen aufgerufen wird (hier die VerySimpleTextAnimation-Instanz), können Sie bestimmen, für welche Thread-Instanz die Sleep-Anweisung bestimmt ist. Ich denke, es wird. Bitte lassen Sie mich wissen, wenn jemand weiß.

In der Vergangenheit hatte ich das Bild, das Thread animierte, aber wenn ich den Prozessablauf erneut verfolge, ist es die while-Schleife der Ausführungsmethode, die die Animation realisiert. Ich passe die Bildrate mit Thread.sleep () an.

Denken Sie an die Verwirrung der Schnittstelle (unkoordiniert ...)

Um eine Schnittstelle zu implementieren, schreiben Sie einfach Implementierungen zwischen dem Klassennamen und dem Schnittstellennamen. Der Implementierungsinhalt entspricht dem Schreiben anderer Methoden. In diesem Artikel habe ich die vorhandene Schnittstelle (Runnable) verwendet, aber wenn Sie eine Klasse schreiben können, auch wenn Sie sie selbst erstellen, ist dies nicht besonders schwierig. Mit anderen Worten, es ist nicht schwer zu schreiben, sondern einfach. Wie der Name "Schnittstelle" andeutet, besteht die Rolle darin, die Objekte zu verbinden und wie eine immaterielle Konvention zu sein (in Swift spielt sie eine ähnliche Rolle). Es gibt ein Objekt namens ** Protokoll **). Da es keine Substanz gibt, kann nichts verstanden werden, wenn man nur die Schnittstelle betrachtet. Um die Schnittstelle zu verstehen, ist es notwendig, sich ** zwischen ** Objekten vorstellen zu können, was die Vorstellung einer Kombination mehrerer Objekte erfordert. Es ist schwierig, sich komplizierte Kombinationen vorzustellen, ohne sich daran zu gewöhnen. Wenn Sie es also als einfach betrachten, ist die Komposition einfach, aber ich verstehe nicht, wie dankbar sie ist (wie in diesem Artikel gesagt werden kann), und es sieht einfach nach einer chaotischen Schreibweise aus. In der tatsächlichen Verwendungssituation wird die Kombination kompliziert und andere Faktoren (Generika usw.) spielen eine Rolle, was es schwierig macht, sich zu konzentrieren. Ich denke auch, dass dies eher auf die Position der Java-Sprache als auf die Benutzeroberfläche zurückzuführen ist, aber es ist für Anfänger nicht sehr attraktiv (vielleicht macht es mich wütend), und es gibt viele Erklärungen aus einer SIer-Perspektive. Java hat einen Nachkommen namens Processing. Sobald ich mich eingelebt habe, möchte ich aus dieser Perspektive einen weiteren Artikel über die Benutzeroberfläche schreiben.

Recommended Posts

Überprüfen Sie die Funktion der Schnittstelle über den Thread
Befehl zum Überprüfen der Anzahl und des Status von Java-Threads
[Schienen] Überprüfen Sie den Inhalt des Objekts
Überprüfen Sie die Version von Cent OS
Überprüfen Sie den Migrationsstatus von Schienen
Ich habe versucht, den Betrieb des gRPC-Servers mit grpcurl zu überprüfen
Überprüfen Sie den Betrieb mit dem Steg mit Maven.
Überprüfen Sie den Inhalt des Java-Zertifikatspeichers
Anmerkung: [Java] Überprüfen Sie den Inhalt des Verzeichnisses
Informationen zur Funktionsweise von next () und nextLine ()
Über die Anzahl der Threads von Completable Future
Überprüfen Sie die Version der Standard-Web-Software.
[Java] Überprüfen Sie die Anzahl der Zeichen
Überprüfen Sie die installierte und aktivierte JDK-Version
Lassen Sie uns das Gefühl von Spring Boot + Swagger 2.0 überprüfen
Ich habe versucht, den Betrieb der http-Anfrage (Put) mit dem Talented API Tester zu überprüfen
[Endgültige Version] Überprüfen Sie den Betrieb des japanischen Kalenders auf der Intensivstation, um das neue Yuan-Problem zu unterstützen.
ArrayList und die Rolle der Schnittstelle aus List
Überprüfen Sie die Kapazität des Linux-Servers. (Df Befehl, du Befehl)
[Java] Überprüfen Sie die JDK-Version der erstellten Kriegsdatei
Überprüfen Sie das Verhalten von Java Intrinsic Locks mit bpftrace
Eine Übersicht über die Spring Framework Resource-Oberfläche
Überprüfen Sie das Ergebnis der generischen Parameterinferenz mit JShell
Überprüfen Sie das Verhalten von include, exclude und ExhaustedRetryException von Spring Retry
Begrenzen Sie die Anzahl der Threads mithilfe des Java Executor Service
Verwenden Sie die Standardmethode der Schnittstelle ordnungsgemäß?
Die Welt der Clara-Regeln (2)
Kommentar: Über die Schnittstelle
Beurteilung des Kalenders
Die Welt der Clara-Regeln (4)
Die Welt der Clara-Regeln (1)
WeakReference-Funktionsprüfung
Die Welt der Clara-Regeln (3)
Die Welt der Clara-Regeln (5)
Die Idee der schnellen Sortierung
Die Idee von jQuery
Überprüfen Sie die Abhängigkeit eines bestimmten Maven-Artefakts in Coursier
Überprüfen Sie den Status der Java-Anwendung, ohne das Überwachungstool zu verwenden
Lassen Sie uns das Betriebsbild (Atmosphäre) des DI-Containers von Spring erfassen
Über den Betrieb der Java-Lesesitzung BOF findet seit 1998 monatlich statt
Die Falle, die die Standardimplementierung der Java 8-Schnittstelle mit sich bringt
So überprüfen Sie die Erweiterung und Größe der hochgeladenen Dateien
[Java] Ich habe über die Vorzüge und Verwendungen von "Schnittstelle" nachgedacht.