Es gibt zwei Möglichkeiten, Themen in Java zu etablieren, nämlich die Thread -Klasse und die Implementierung der Runnable -Schnittstelle.
Erbenfaden
öffentliche Klasse MyThread erweitert Thread {public myThread (String name) {super (name); } int i; public void run () {für (i = 0; i <5; i ++) {System.out.println (getName ()+"-"+i); }} public static void main (String [] agrs) {new myThread ("thread1"). start (); New MyThread ("Thread2"). Start (); }} /*Thread 1-0Thread 1-1Thread 1-2Thread 1-3Thread 1-4Thread 2-0Thread 2-1Thread 2-2Thread 2-3Thread 2-4* / / / / / / / / / / / /Wie oben erwähnt, müssen Threadobjekte in Java in Form einer Klasse erstellt werden, und die Run () -Methode der Basisklasse muss in dieser Klasse überschrieben werden. Diese Methode ist tatsächlich der Ausführungskörper des Threads. Wenn Sie die Startmethode dieser Klasseninstanz aufrufen, werden die Auslaufmethode implizit aufgerufen.
Es ist nicht schwer zu erkennen, dass MyThread zweimal neu war, die Beispiele der zweimalen unterschiedlich, das heißt, jeder hat seine eigenen I -Variablen, die unabhängig voneinander sind.
Runnable -Schnittstelle
öffentliche Klasse Myrunnable Geräte runnable {int i; public void run () {für (i = 0; i <50; i ++) {System.out.println (Thread.currentThread (). neuer Thread (Myrun, "Thread1"). start (); neuer Thread (Myrun, "Thread2"). Start (); } } /*Thread 1-0thread 1-1thread 2-0thread 2-3thread 2-4thread 2-5thread 2-6thread 2-7thread 2-8th thread 2-9th thread 2-10th thread 2-11th thread 2-12th thread 2-13thread 2-14th thread 2-15th thread 1-2th thread 2-16th thread 2-18th thread 2-19th thread 2-20th thread 2-21th thread 2-22th thread 2-23th thread 2-24th thread 1-17th thread 2--25 threads 1--26 threads 2--27 threads 1--28 threads 1--30 threads 2--29 threads 1--31 threads 2--32 threads 2--34 threads 2--35 threads 2--36 threads 2--37 threads 1--33 threads 2--38 threads 1--39 threads 1--41 threads 2-40 Threads 1--42 Threads 1--44 Threads 1--45 Threads 2-43 Threads 1--46 Threads 2-47 Threads 2-49 Threads 1-48*//////////Es ist ersichtlich, dass, da diese Methode ein Objekt als Ziel in die Thread -Klasse lädt, auch wenn es viele Thread -Objekte in neuem gibt, solange das Ziel das gleiche Referenzobjekt ist, die Auslaufmethode des Objekts aufgerufen wird und alle Threads die Ressourcen des Zielobjekts teilen. Daher sehen Sie, dass Thread 1 und Thread 2 insgesamt 51 Mal ausgeben, und die beiden Gewinde haben die Ausgabe von I von 0 bis 49 abgeschlossen und nicht 5 -mal wie oben ausgeben. Was die Ausgabe von 51 betrifft, geben die beiden Threads fast gleichzeitig in den Bereitschaftszustand ein (die Startmethode lässt nur den Thread den Bereitschaftszustand eingeben). Es ist nicht schwierig zu erkennen, dass wenn ich gleich 0 ist, Thread 1 und Thread 2 gleichzeitig im Laufstatus im Laufe des laufenden Zustands sind, was zu einer gleichberechtigten Phänomenerschaft und der Leistung von i = 0 zusammen ist. Danach wechselt die CPU ständig die Gewinde, so dass gleichzeitig nur ein Thread ausgegeben wird.
Threadstatus
Themen sind in 4 Zustände unterteilt
FEEFERSCHAFT: Rufen Sie die Startmethode an und geben Sie den Ready -Status ein.
Laufstatus: Der Thread im Ready State wird von JVM geplant und wird zum Laufstatus.
Blockierungszustand: Wenn einige Synchronisationsmethoden keine Ergebnisse zurückgeben, tritt ein Blockierungszustand oder ein Schlaf und YEILD auf.
Todeszustand: Die Methodekörper wird ausgeführt oder ein Thread ist gezwungen, aufzuhören.
Grundlegende Operationen von Threads
Join () Merge -Thread: Nach dem aktuellen Thread die Join -Methode eines Threads wartet, bis der Thread die Ausführung abschließt, bevor der Thread fortgesetzt wird.
Schlaf (lange Millisekunden) Fadenschlaf: Blockiert den aktuellen Faden und wird nur so weitergesetzt, wenn die Blockierungszeit abgelaufen ist. Wenn Sie erneut blockieren, wird das CPU -Besitz an andere Fäden übergeben, sodass der Schlaf (1) häufig zum Wechseln von Gewinnen verwendet wird.
** Ertrag () Thread -Konzessionen: ** yebild ähnelt dem Schlaf, aber es wird nur Zugeständnisse zu anderen Fäden auf höherem oder auf demselben Niveau sind. Wenn keine anderen Threads niedriger als ihre Ebene sind, wird der Thread erneut ausgeführt.
Hintergrundfaden
Nachdem ein Programm vom Betriebssystem ausgeführt wurde, wird es einen Prozess geben, und ein Prozess hat mindestens einen Thread (Haupt -Thread). Der Hauptfaden hat nicht viele besondere Funktionen als andere Threads, nur weil er der früheste Faden ist, der ausgeführt wird, werden andere Threads im Haupt -Thread erstellt. Wenn dies nicht angegeben ist, wird der Vordergrundgewinde (einschließlich des Hauptfadens) standardmäßig erstellt. Wenn SetDaemon (True) aufgerufen wird, wird der Thread explizit als Hintergrund -Thread festgelegt. Der Hintergrund -Thread ist ein Daemon -Thread. Wie Sie aus dem Namen sehen können, besteht die Hauptfunktion darin, Wächter- und Servicefunktionen für andere Threads bereitzustellen. Wenn alle Vordergrund -Threads enden, wird der Hintergrund -Thread gezwungen, zu diesem Zeitpunkt keine Bedeutung zu haben.
Vordergrundfaden
öffentliche Klasse VoranDbackThread erweitert Thread {public forandbackThread (String -Name) {Super (Name); } public void run () {int i; für (i = 0; i <9999; i ++) {System.out.println (this.getName ()+"-"+i); }} public static void main (String [] args) {voranDbackThread th = neuer vorangebackthread ("Thread a"); //th.setdaemon(True); th.start (); int j; für (j = 0; j <3; j ++) {System.out.println (Thread.currentThread (). getName ()+"-"+j); }}}Der vollständige Ausgangs -Child -Thread des Programms beträgt 0 bis 9998; Dies bedeutet, dass der Hauptfaden nicht speziell ist und sein Ende den Betrieb anderer Vordergrundbefäden nicht beeinflusst.
Hintergrundfaden
öffentliche Klasse VoranDbackThread erweitert Thread {public forandbackThread (String -Name) {Super (Name); } public void run () {int i; für (i = 0; i <9999; i ++) {System.out.println (this.getName ()+"-"+i); }} public static void main (String [] args) {voranDbackThread th = neuer vorangebackthread ("Thread a"); th.setdaemon (wahr); th.start (); int j; für (j = 0; j <3; j ++) {System.out.println (Thread.currentThread (). getName ()+"-"+j); }}}Das Programm kann nicht vollständig von 0-9998 ausgeben und wechselt, was darauf hinweist, dass JVM nach dem Hauptfaden des Vordergrunds den Hintergrundfaden zum Ende erzwingt.
Zusammenfassen
In dem oben genannten dreht sich alles um die Analyse grundlegender Beispiele für Java -Threads in diesem Artikel. Ich hoffe, es wird für alle hilfreich sein. Interessierte Freunde können weiterhin auf andere verwandte Themen auf dieser Website verweisen. Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite!