Durch das Erben von Thread und das Überschreiben von dessen run() werden die auszuführenden Aufgaben in der run-Methode definiert. Die erstellte Unterklasse kann die Thread-Methode ausführen, indem sie die start()-Methode aufruft.
Durch die Vererbung der von Thread implementierten Thread-Klasse können Instanzvariablen der Thread-Klasse nicht von mehreren Threads gemeinsam genutzt werden. Es müssen verschiedene Thread-Objekte erstellt werden, und Ressourcen werden natürlich nicht gemeinsam genutzt.
1) Definieren Sie die UserThread-Klasse und erben Sie die Thread-Klasse
2) Überschreiben Sie die run( )-Methode
3) Erstellen Sie ein UserThread-Objekt
4) Rufen Sie die start( )-Methode auf
Datenressourcen werden nicht gemeinsam genutzt und mehrere Threads erledigen ihre eigenen Aufgaben. Wenn beispielsweise drei Kassen gleichzeitig Tickets verkaufen und jede ihre eigenen Tickets verkauft, besteht das Problem, dass drei Kassen dieselben Tickets verkaufen.
Sie müssen zunächst eine Klasse definieren, um die Runnable-Schnittstelle zu implementieren und die run()-Methode der Schnittstelle zu überschreiben. Diese Ausführungsmethode ist der Thread-Ausführungskörper. Erstellen Sie dann ein Objekt der Runnable-Implementierungsklasse als Parameterziel für die Erstellung des Thread-Objekts. Dieses Thread-Objekt ist das eigentliche Thread-Objekt.
Verwenden Sie die Thread-Klasse, die die Runnable-Schnittstelle implementiert, um Objekte zu erstellen und eine Ressourcenfreigabe zwischen Threads zu erreichen.
1) Definieren Sie eine UserRun-Klasse und implementieren Sie die Runnble-Schnittstelle
2) Überschreiben Sie die run()-Methode
3) Erstellen Sie ein Objekt der UserRun-Klasse
4) Erstellen Sie ein Objekt der Thread-Klasse und das Objekt der Die UserRun-Klasse dient als Konstruktor der Thread-Klassenparameter
5) Thread starten
Bei der gemeinsamen Nutzung von Datenressourcen führen mehrere Threads gemeinsam eine Aufgabe aus (mehrere Threads teilen sich die Ressourcen zum Erstellen von Thread-Objekten). Beispielsweise verkaufen drei Ticketschalter (drei Threads) gleichzeitig Tickets (Tickets in der MyThread-Klasse) und die drei Threads nutzen gemeinsam Ressourcen.
Die Callable-Schnittstelle ist wie eine aktualisierte Version der Runable-Schnittstelle. Die von ihr bereitgestellte call()-Methode dient als Ausführungskörper des Threads und ermöglicht einen Rückgabewert.
Das Callable-Objekt kann nicht direkt als Ziel des Thread-Objekts verwendet werden, da die Callable-Schnittstelle eine neue Schnittstelle in Java5 und keine Unterschnittstelle der Runnable-Schnittstelle ist.
Zur Lösung dieses Problems wird die Future-Schnittstelle eingeführt. Diese Schnittstelle kann den Rückgabewert von call() akzeptieren. Die RunnableFuture-Schnittstelle ist eine Unterschnittstelle der Future-Schnittstelle und der Runnable-Schnittstelle und kann als verwendet werden das Ziel des Thread-Objekts.
1) Definieren Sie die Klasse UserCallable und implementieren Sie die Callable-Schnittstelle
2) Überschreiben Sie die call()-Methode
3) Erstellen Sie ein Objekt von UserCallable
4) Erstellen Sie ein Objekt von FutureTask, einer Unterklasse der RunnableFuture-Schnittstelle, und die Parameter des Konstruktors ist das Objekt von UserCallable
5) Erstellen Sie ein Objekt der Thread-Klasse, und der Parameter des Konstruktors ist das Objekt von FutureTask
6) Starten Sie den Thread
Freigabe von Datenressourcen, mehrere Threads erledigen gemeinsam eine Aufgabe (mehrere Threads teilen sich die Ressourcen zum Erstellen von Thread-Objekten). Beispielsweise verkaufen drei Ticketschalter (drei Threads) gleichzeitig Tickets (Tickets in der MyThread-Klasse) und die drei Threads nutzen gemeinsam Ressourcen. Gleichzeitig gibt es nach Abschluss des Thread-Aufrufs einen Rückgabewert.
Die Timer-Klassen Timer und TimerTask können als weitere Möglichkeit zur Implementierung von Threads verwendet werden.
Timer ist eine Threading-Funktion, mit der Aufgaben für die spätere Ausführung in einem Hintergrundthread geplant werden. Die Aufgabe kann so geplant werden, dass sie einmal oder wiederholt in regelmäßigen Abständen ausgeführt wird. Sie kann als Timer betrachtet werden und TimerTask kann geplant werden.
TimerTask ist eine abstrakte Klasse, die die Runnable-Schnittstelle implementiert und daher über Multithreading-Funktionen verfügt.
1) Definieren Sie die Klasse UserTimerTask und erben Sie die abstrakte Klasse TimerTask
2) Erstellen Sie ein Objekt der UserTask-Klasse
3) Erstellen Sie ein Objekt der Timer-Klasse und legen Sie die Ausführungsstrategie der Aufgabe fest
Threads, die von der Timer-Klasse erstellt wurden, werden eher für die Verarbeitung geplanter Aufgaben verwendet, und Datenressourcen werden nicht zwischen Threads gemeinsam genutzt, und mehrere Threads führen ihre eigenen Aufgaben aus.
Thread-Pools können über die Executors-Toolklasse erstellt werden.
Verbessern Sie die Reaktionsgeschwindigkeit des Systems. Wenn eine Aufgabe eintrifft, kann sie durch Wiederverwendung des vorhandenen Threads sofort ausgeführt werden, ohne auf die Erstellung eines neuen Threads warten zu müssen.
Reduzieren Sie den Ressourcenverbrauch des Systems und reduzieren Sie den Verbrauch, der durch die Erstellung und Zerstörung von Threads verursacht wird, indem Sie vorhandene Threads wiederverwenden.
Praktisch, um die Anzahl gleichzeitiger Threads zu steuern. Denn wenn Threads ohne Begrenzung erstellt werden, kann es aufgrund übermäßiger Speichernutzung zu OOM und zu übermäßigem CPU-Switching kommen.
① Erstellen Sie einen Thread-Pool fester Größe über Executors.newFixedThreadPool(5)
② Überschreiben Sie die run( )-Methode des Ausführbare Klasse und verwenden Sie den Thread-Pool, um Aufgaben auszuführen. ③Shutdown () schließt den Thread-Pool. (2) Code-Implementierung Bei der gemeinsamen Nutzung von Datenressourcen arbeiten mehrere Threads zusammen, um eine Aufgabe abzuschließen.
(1) Spezifische Schritte
① Erstellen Sie einen Single-Thread-Pool über Executors.newSingleThreadExecutor( )
Der Thread-Pool erstellt nur einen Thread, um die Aufgabe auszuführen.
(1) Spezifische Schritte
① Erstellen Sie so viele Thread-Pools wie möglich über Executors.newCachedThreadPool( )
Diese Methode erstellt so viele Threads wie möglich, um die Aufgabe abzuschließen, wie in der Fall Obwohl nur 10 Tickets vorhanden sind, hat der Thread-Pool mindestens 12 Threads generiert.
(1) Spezifische Schritte
① Verwenden Sie Executors.newScheduledThreadPool(5), um eine feste Anzahl von Kern-Threads zu erstellen (Mindestanzahl zu verwaltender Threads, keine Threads). wird nach der Thread-Erstellung erstellt (Recycled) Thread-Pool, Threads werden regelmäßig wie geplant ausgeführt.
① Erstellen Sie einen Thread-Pool über Executors.newWorkStealingPool()
② Schreiben Sie die run()-Methode der Runnable-Klasse neu Die Thread-Klasse Das Objekt ruft das Runnable-Klassenobjekt auf und verwendet den Thread-Pool, um die Aufgabe auszuführen
③Sleep() ermöglicht es dem Hauptthread, auf den Abschluss der Ausführung durch den untergeordneten Thread zu warten, oder Sie können einen Zähler verwenden
④Shutdown(), um die zu schließen Thread-Pool
Da jeder Thread seine eigene Aufgabenwarteschlange hat und es mehr und weniger Aufgaben gibt, kann es zu einem Ungleichgewicht der CPU-Last kommen. Diese Methode kann die Vorteile von Multi-Core-CPUs effektiv nutzen. Threads mit weniger Aufgaben können Aufgaben von Threads mit mehr Aufgaben „stehlen“ und so die Ausführung von Aufgaben auf jeder CPU ausbalancieren.
Das obige ist der detaillierte Inhalt vonWelche Möglichkeiten gibt es, Multithreading in Java zu erstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!