Java -Thread -Vergleichsthread, runnierbar, abrufbar
Java verwendet die Thread -Klasse, um Threads darzustellen, und alle Feldobjekte müssen Instanzen der Thread -Klasse oder ihrer Unterklasse sein. Die Funktion jedes Threads besteht darin, eine bestimmte Aufgabe zu erledigen, die tatsächlich einen Programmfluss ausführen soll. Java verwendet Thread -Ausführungskörper, um diesen Programmfluss darzustellen.
1. Erben Sie die Thread -Klasse, um Thread zu erstellen
Die Schritte zum Starten von Multithreading sind wie folgt:
(1) Definieren Sie die Unterklasse der Thread -Klasse und überschreiben Sie die Run () -Methode der Klasse. Die Methode der Methode der Run () -Methode repräsentiert die Aufgaben, die der Klassen -Thread ausführen muss. Daher wird die Run () -Methode als Thread -Ausführungsgremium bezeichnet.
(2) Erstellen Sie eine Instanz der Thread -Unterklasse, dh ein Thread -Objekt.
(3) Rufen Sie die Sterne () -Methode des Threads auf, um den Thread zu starten.
Die relevanten Codes sind wie folgt:
/ *** Erben Sie die innere Klasse des Threads, um Tickets zu kaufen*/ öffentliche Klasse FirstThread erweitert Thread {private int i; privates Int -Ticket = 10; @Override public void run () {for (; i <20; i ++) {// Wenn er Thread erben, verwenden Sie diesen direkt, um den aktuellen Thread zu erhalten, GetName () den Namen des aktuellen Threads // log.d (Tag, getName ()+"+i) erhalten; if (this.ticket> 0) {log.e (Tag, getName () + ", Ticketverkauf: Ticket =" + Ticket--); }}}} private void starticketthread () {log.d (tag, "starticketthread,"+thread.currentThread (). getName ()); FirstThread Thread1 = new FirstThread (); FirstThread Thread2 = new FirstThread (); First thread thread3 = new FirstThread (); Thread1.Start (); thread2.Start (); thread3.Start (); // Öffnen Sie 3 Threads, um Tickets zu kaufen, jeder Thread verkaufte 10 Tickets und insgesamt 30 Tickets}}Auslaufergebnisse:
Sie können sehen, dass die von 3 Threads eingegebenen Stimmenvariablen nicht kontinuierlich sind. HINWEIS: Ticket ist eine Instanzeigenschaft von First Thread, nicht eine lokale Variable, aber da das Programm jedes Mal, wenn es ein Thread -Objekt erstellt hat, ein FirstThread -Objekt erstellen muss, teilen alle mehrere Threads nicht die Attribute der Instanz.
2. Implementieren Sie die Runnable -Schnittstelle, um Threads zu erstellen
Hinweis: Thread im öffentlichen Klassen implementiert Runnable
(1) Definieren Sie die Implementierungsklasse der Runnable -Schnittstelle und überschreiben Sie die Run () -Methode der Schnittstelle. Der Methodekörper der Run () -Methode ist auch der Thread -Ausführungskörper des Fadens.
(2) Erstellen Sie eine Instanz der Runnable -Instanzklasse. Diese Instanz wird als Thread -Ziel verwendet, um ein Thread -Objekt zu erstellen. Das Thread -Objekt ist das reale Objekt.
Die relevanten Codes sind wie folgt:
/ ** * Implementieren Sie die Runnable -Schnittstelle und erstellen Sie eine Thread -Klasse */ Public Class SecondThread Implements Runnable {private int i; privates int Ticket = 100; @Override public void run () {for (; i <20; i ++) {// Wenn die Thread -Klasse die Runnable -Schnittstelle implementiert, können Sie nur Thread verwenden. if (this.ticket> 0) {log.e (tag, thread.currentThread (). getName () + ", Ticketverkauf: Ticket =" + Ticket--); }}}} private void starticketthread2 () {log.d (tag, "starticketthread2,"+thread.currentThread (). getName ()); SecondThread SecondThread = New SecondThread (); // Erstellen Sie einen neuen Thread über einen neuen Thread (Ziel, Name) neuer Thread (SecondThread, "Ticket -Käufer 1"). Start (); neuer Thread (SecondThread, "Ticket -Käufer 2"). start (); neuer Thread (SecondThread, "Ticket Buyer 3"). start (); // Obwohl 3 Threads geöffnet wurden, wurden insgesamt nur 100 Tickets gekauft}Auslaufergebnisse:
Sie können sehen, dass die von 3 Threads eingegebenen Stimmenvariablen kontinuierlich sind und mehrere Threads die Eigenschaften der Instanz der Thread -Klasse mithilfe der Runnable -Schnittstelle freigeben können. Dies liegt daran, dass das vom Programm erstellte Runnable -Objekt nur das Ziel eines Threads ist und mehrere Threads dasselbe Ziel teilen können, sodass mehrere Threads die Instanzeigenschaften derselben Thread -Klasse (die tatsächlich die Zielklasse des Threads sein sollten) freigeben können).
3. Erstellen Sie Threads mit Callable und Future
Ab Java 5 bietet Java eine Callable -Schnittstelle, eine verbesserte Version von Runnable. Callable bietet eine Klasse namens () Methode, die als Thread -Ausführungskörper verwendet werden kann, aber die CALL () -Methode ist leistungsfähiger.
(1) Die Methode call () kann einen Rückgabewert (2) Die CALL () -Methode kann eine Ausnahme deklarieren
Daher können wir ein Callable -Objekt als Thread -Ziel bereitstellen, und der Testamentsvollstrecker des Threads ist die Call () -Methode des Callable -Objekts. Gleichzeitig bietet Java 5 die zukünftige Schnittstelle zur Darstellung des Rückgabewerts der CALL () -Methode in der Callable -Schnittstelle und bietet eine Futuretask -Implementierungsklasse. Diese Implementierungsklasse implementiert die zukünftige Schnittstelle und implementiert die Runnable -Schnittstelle - ein Ziel, das als Thread -Klasse verwendet werden kann.
Die Startschritte sind wie folgt:
(1) Erstellen Sie eine Implementierungsklasse der Callable -Schnittstelle und implementieren Sie die Call () -Methode. Die CALL () -Methode wird als Ausführungskörper des Threads verwendet, und die CALL () -Methode hat einen Rückgabewert.
(2) Erstellen Sie eine Instanz der Callable Implementierungsklasse und verwenden Sie die Futuretask -Klasse, um das Callable -Objekt zu wickeln. Das Futuretask -Objekt verkauft den Rückgabewert der CALL () -Methode.
(3) Erstellen und starten Sie einen neuen Thread mit dem Futuretask -Objekt als Ziel des Thread -Objekts.
(4) Rufen Sie die Get () -Methode des Futuretask -Objekts auf, um den Rückgabewert zu erhalten, nachdem der untergeordnete Thread ausgeführt wurde.
Die relevanten Codes sind wie folgt:
/ *** Verwenden Sie Callable, um Thread -Klasse zu implementieren @Override public Integer call () {für (int i = 0; i <10; i ++) {// Erhalten Sie den aktuellen Thread, Sie können nur Thread.currentThread () verwenden, um den aktuellen Threadnamen // log.d (Tag, Thread.currentThread () zu erhalten. GetName ()+"+i); if (this.ticket> 0) {log.e (tag, thread.currentThread (). getName () + ", Tickets: Ticket =" + Ticket--); }} Rückgabe -Ticket; }} private void starcallablAllaThread () {Third thread thread = new ThirdThread (); Futuretask <Gearner> task = new futuretask <Gearneger> (Third thread); neuer Thread (Aufgabe, "Thread mit Rückgabewert"). start (); try {Integer Integer = task.get (); Log.d (tag, "starcallablaThread, der Rückgabewert des untergeordneten Threads ="+Integer); } catch (interruptedException e) {e.printstacktrace (); } catch (executionException e) {e.printstacktrace (); }}Auslaufergebnisse:
HINWEIS: CALL (CALL () -Methode von CALLABLE ermöglicht es Deklarationen, Ausnahmen zu veröffentlichen und Rückgabewerte zu ermöglichen.
Das Programm ruft schließlich die Get () -Methode des Futuretask -Objekts auf, um den Rückgabewert der CALL () -Methode zurückzugeben, wodurch der Haupt -Thread blockiert wird, bis die CALL () -Methode endet und zurückgibt.
4. Vergleich von drei Wegen
Erstellen Sie Multi-Threading, indem Sie die Thread-Klasse erben
Nachteile: Die Thread -Klasse wurde nicht von anderen übergeordneten Klassen geerbt.
Vorteile: einfach zu schreiben
Erstellen Sie Multi-Threading mithilfe der Methode zum Erben von Runnable und Callable-Schnittstellen
Nachteile: Die Programmierung ist etwas kompliziert. Wenn Sie auf den aktuellen Thread zugreifen müssen, müssen Sie Thread.currentThread () verwenden.
Vorteile:
(1) Es kann auch andere Klassen erben (2) Mehrere Threads können ein Zielobjekt freigeben. Daher ist es für mehrere identische Threads sehr geeignet, um dieselbe Ressource zu verarbeiten, wodurch CPU, Code und Daten getrennt werden, um ein klares Modell zu bilden, das die objektorientierte Vorstellung des Unterrichts besser widerspiegelt.
Danke fürs Lesen, ich hoffe, es kann Ihnen helfen. Vielen Dank für Ihre Unterstützung für diese Seite!