Das Java.util.Concurrent-Paket bietet Klassen über Multi-Thread-Operationen. Die häufig verwendeten sind Executorservice und ihre Implementierungsklassen (wie Threadpoolexecutor usw.), Executor, Executors, Future, Callable usw.
1. ExecutorService (von der Executor geerbt) Schnittstelle: Bietet einige asynchrone Multi-Thread-Betriebsmethoden, wie z.
2. Executor -Schnittstelle: Führen Sie die eingereichte Aufgabe (Thread) aus, wobei nur eine Methode ausgeführt wird (Runnable A)
2. Ausführende Klasse: Bietet einige Fabrikmethoden und einige öffentliche Methoden zum Betrieb von Unterklassen und ThreadFactory usw. wie Newxxx (), xxxThreadfactory () usw.
3. Futroue -Schnittstelle: Repräsentiert das Ergebnis der Thread -Ausführung, stellt Methoden zur Erlangung von Thread -Ausführungsergebnissen und Abbrechen von Threads, wie Get (), Cancle () usw.
4. CALLABLE -Schnittstelle: Der Thread mit Rückgabewert wird von JDK1.5 bereitgestellt, um eine neue Schnittstelle auszuführen
Machen Sie einfache Aufzeichnungen über das Verständnis von Executorservice und Zukunft
Code:
public class main {private static int count = 0; public static void main (string [] args) {list <future> resultlist = new LinkedList <> (); /*** Executors.NewCachedThreadpool () Erstellen Sie einen Thread -Cache -Pool. Wenn der Thread in den 60er Jahren nicht verwendet wird, wird der Thread gestoppt und aus dem Cache -Pool* Executors entfernt. NewScheduled threadpool () Erstellen Sie einen Thread -Pool mit fester Kapazität, und die Threads im Inneren führen nach dem festgelegten Zeitplanungszeit* aus. Thread*/ ExecutorService ExecutorService = Executors.NewCachedThreadpool (); für (int i = 0; i <10; i ++) {Future = ExecutorService.Submit (new Callable <string> () {@Override public String call () {try {system.out.println (thread.current thread (). Main.Count; resultlist.add (future); } ExecutorService.shutdown (); für (Future Future: Ergebnisliste) {try {system.out.println (future.get () + "..is over ..."); } catch (interruptedException e) {e.printstacktrace (); } catch (executionException e) {e.printstacktrace (); }} System.out.println ("Haupt -Thread -Ende ..."); }}Ausgabe:
Pool-1-thread-1pool-1-thread-2pool-1-thread-3pool-1-thread-4pool-1-thread-5pool-1-thread-6pool-1-thread-7pool-1-thread-8pool-1-9pool-1-Thread-1-Thread-1-Thread-1-Thread-1-Thread-1-Thread-2..start-1-0pool-1-Thread-2..start-1-0pool-1-Thread-2..start: Hauptzahl: ... 1Pool-1-thread-2.. End Hauptzahl: ... 1pool-1-thread-1.. End Hauptzahl: ... 1Pool-1-thread-3..NED Hauptzahl: ... 1pool-1-thread-2..end Hauptzahl: ... 1pool-1-thread-1..end Hauptzählung: ... 1pool-1-thead-3..end Main-2. Over ... Pool-1-Thread-4..Start Hauptzahl: ... 2Pool-1-thread-3..is Over ... Pool-1-Thread-4..N-Hauptzahl: ... 3pool-1-thread-4..is Over ... Pool-1-5..Start Hauptzählung: ... 3pool-1-thread-5..end Main Count: ... 4pol-1-1-1-1-Thread-5..is Over ... iis Over ... iis Over .... is Over ... iis Over .... is Over ... iis Over ... iis Over .... is Over ... is Over ... is Over ... is Over .... is Over ... iis Over .... is Over ... is Over ... is Over .... is Over ... iis Over ... iis Over ... -Pool-1-1-Thread- Graf: ... 4pool-1-thread-6.. End Main Count: ... 4pool-1-thread-6..end Main Count: ... 4pool-1-thread-6..end Main Count: ... 4pool-1-thread-6..end Hauptzahl: ... 4pool-1-thread-6..end Main Count: ... 5pool-1-thead-6..is over ... pool-1-thead-7-7-7-7-7. count:...6pool-1-thread-7..is over...pool-1-thread-8..start Main count:...6pool-1-thread-8..end Main count:...7pool-1-thread-8..is over...pool-1-thread-9..start Main count:...7pool-1-thread-9..end Main count:...8pool-1-thread-9..is over...pool-1-thread-10..start Main Graf: ... 7pool-1-thread-9.. End Main Count: ... 8pool-1-thread-9..IS Over ... Pool-1-thread-10..Start Main Count: ... 8pool-1-Thread-9..IS Over ... Pool-1-1-1-1-Thread-10-Thread-Thread-Thread-Thread-Thread-Thread-Thread-Thread.
Die Konsole druckt das obere Ausgabeergebnis, nachdem er 5 Sekunden lang gewartet hat. Der Grund dafür ist, dass wenn alle Themen beginnen, es eine gleichzeitige Operation ist und 5 Sekunden wartet. Insgesamt scheint es also nur 5 Sekunden gewartet zu haben. Dies ist eine gleichzeitige Operation.
Zusammenfassen:
1. Die Differenz zwischen der von ExecutorService bereitgestellten Methode execute () und der methode arrang () :
A. Die Methode execute () akzeptiert nur Instanzen des Runnable -Typs, sodass sie den Rückgabewert nicht erhalten kann, und es kann auch nicht die Situation der Thread -Ausführung dynamisch erhalten.
B. Die Methode subjekt () akzeptiert runnable und aufrufbare Instanzen und wird die zukünftige Instanz zurückgeben. Die Get () -Methode der zukünftigen Instanz kann den Rückgabewert der Thread -Ausführung erhalten und Thread -Ausführungsausnahmen werfen. Wenn Sie also das Ergebnis erhalten möchten, das durch Thread -Ausführung zurückgegeben wird und mögliche Ausnahmen während der Thread -Ausführung verarbeiten kann oder wenn Sie die Thread -Ausführung in der Mitte abbrechen möchten, können Sie die Methode subjekt () verwenden
2. Durch die Ausgabe können Sie feststellen, dass die Hauptmethode (Hauptfaden) endet, nachdem alle Threads die Ausführung abgeschlossen haben. Der Grund:
A. Holen Sie sich die zukünftige Instanz über die Methode subjekt () und erhalten Sie das Thread -Rückgabeergebnis über die Get () -Methode der zukünftigen Instanz. Die Get () -Methode der zukünftigen Instanz wartet auf die Ausführung des Thread
B. Wenn die mit rot markierte für die oben markierte Schleife entfernt wird, endet die Hauptmethode (Hauptfaden) frühzeitig, ohne auf das Ende aller untergeordneten Fäden zu warten
Wieder auffüllen:
1. Wenn mehrere Threads gleichzeitig ausgeführt werden, wenn eine Ausnahme in einem der Threads auftritt und nicht verarbeitet wird, stoppt der Thread automatisch die Ausführung, die anderen Threads werden jedoch weiterhin normal ausgeführt. Aus diesem Grund kann Tomcat weiterhin Dienste anbieten, wenn eine Ausnahme in der Tomcat -Anfrage auftritt.
2. Tomcat bietet einen Fadenpool und einen wartenden Pool. Jede Anfrage startet einen neuen Thread neu, um die Anfrage zu verarbeiten. Wenn die Fäden im Thread -Pool aufgebraucht sind, werden sie in den wartenden Pool gelegt und warten. Wenn ein Thread wieder in den Thread -Pool freigelassen wird, wird ein Thread zugewiesen, um die Anforderungen im Wartepool zu verarbeiten.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.