1. Executors
Die Executors -Klasse kann als "Werkzeugklasse" angesehen werden. Unter Berufung auf die Einführung in die JDK1.6 -API:
Fabrik- und praktische Methoden des Executors, ExecutorService, enderExecutorService, ThreadFactory und Callable -Klassen, die in diesem Paket definiert sind. Diese Klasse unterstützt verschiedene Methoden:
(1) Erstellen und geben Sie die Methode zum Einstellen des Ausführendenservice mit häufig verwendeten Konfigurationszeichenfolgen.
(2) Erstellen und geben Sie die Methode zur Festlegung der enderExecutorservice mit häufig verwendeten Konfigurationszeichenfolgen.
(3) Erstellen und geben Sie die "verpackte" Ausführungsdienste erstellen und geben Sie zurück, die die Rekonfiguration deaktiviert, indem die implementierungsspezifischen Methoden nicht zugänglich gemacht werden.
(4) Erstellen und geben Sie eine Methode des ThreadFactory zurück und geben Sie den neu erstellten Thread in einen bekannten Zustand ein.
(5) Erstellen und senden Sie eine nicht entworfene Anrufabläufe, damit sie in Ausführungsmethoden verwendet werden kann, die CALLABLE erfordern.
Über diese Klasse können Sie mehrere Instanzen von Threadpools erhalten, z. Am einfachsten ist es, es zu verwenden, um ausgeführte Objekte auszuführen, oder Sie können einige Objekte ausführen, die Callable <T> implementieren. Mit der Start () -Methode des Threads gibt es keinen Rückgabewert. Wenn die vom Thread ausgeführte Methode einen Rückgabewert hat, wäre es besser, Executorservice zu verwenden. Sie können Subjekt (), InvokeAll () oder Invokeany () auswählen und die entsprechende Methode gemäß der spezifischen Situation auswählen.
Einige der in dieser Klasse bereitgestellten Methoden sind:
1.1 öffentlicher statischer Executorservice NewcachedThreadpool ()
Erstellen Sie einen Thread -Pool, der nach Bedarf neue Threads erstellt, diese jedoch wiederverwenden, wenn zuvor konstruierte Threads verfügbar sind. Diese Threadpools verbessern normalerweise die Programmleistung für Programme, die viele kurzfristige asynchrone Aufgaben ausführen.
1.2 öffentliches statisches Executorservice Newfixed threadpool (int nthreads)
Erstellen Sie einen Thread -Pool mit einer festen Anzahl wiederverwendbarer Threads, um diese Threads in einer gemeinsamen unbegrenzten Warteschlange auszuführen.
1.3 öffentlicher statischer Executorservice NewsingLethreadExecutor ()
Erstellen Sie einen Testamentsvollstrecker, der einen einzelnen Worker -Thread verwendet, um den Thread in einer unbegrenzten Warteschlange auszuführen.
Alle drei Methoden können mit Instanzen von Schnittstellen -Threadfaktorien verwendet werden. Und geben Sie eine Instanz der ExecutorService -Schnittstelle zurück.
2. Schnittstellen -Threadfaktor
Erstellen Sie nach Bedarf neue Threadobjekte. Die Verwendung von Thread -Fabriken erfordert kein manuelles Schreiben neuer Thread -Aufrufe mehr, sodass Anwendungen spezielle Thread -Unterklassen, Eigenschaften usw. verwenden können.
Die einfachste Implementierung dieser Schnittstelle ist:
Klasse SimpleTheadFactory implementiert ThreadFactory {public thread newThread (runnable r) {return neuer Thread (r); }} A. Schnittstelle Executorservice
Diese Schnittstelle bietet eine Methode zur Verwaltung der Beendigung.
4. Erstellen Sie einen Standard -Thread -Pool -Start -Thread
4.1 Geben Sie einen einfachen Thread an, der die Runnable -Schnittstelle implementiert
Mythead.java
Paket com.zj.concurrency.executors; öffentliche Klasse mythead implementiert runnable {private int count = 1, nummer; public myThread (int num) {number = num; System.out.println ("Thread-" + Nummer); } public void run () {while (true) {system.out.println ("thread-" + number + "run" + count + "time (s)"); if (++ count == 3) return; }}} In diesem Thread werden die entsprechenden Erstellungs- und Ausführungsinformationen ausgedruckt.
4.2 Thread mit CachedThreadpool starten
CachedThreadpool.java
Paket com.zj.concurrency.executors; import java.util.concurrent.executorservice; import Java.util.concurrent.executors; öffentliche Klasse CachedThreadpool {public static void main (String [] args) {ExecutorService exec = Executors.NewcachedThreadpool (); für (int i = 0; i <5; i ++) exec.execute (neuer MyThread (i)); exec.shutdown (); }} Ergebnis:
Erstellen Sie Thread-0create Thread-1Create Thread-2Create Thread-3Thread-0 Führen Sie 1 Zeit (s) Thread-0-Ausführen 2 Zeit (s) Thread-1 Führen Sie 1 Zeit (s) Thread-1 aus 2 Zeit (s) Thread-2-Ausführen 1 Zeit (s) Thread-2 Run 2 Zeit
4.3 Thread mit Perisiforthreadpool starten
FIFIFTHEADPOOL.JAVAPACKAGE COM.ZJ.CONCURRENCY.EXECUTORS; Import Java.util.Concurrent.executorservice; Import Java.util.Concurrent.executors; public class cipeadpool {public static void main (String [] args) {ExecutorService exec = Executors.NewFixedThreadpool (2); für (int i = 0; i <5; i ++) exec.execute (neuer MyThread (i)); exec.shutdown (); }} Ergebnis:
Create Thread-0Create Thread-1Create Thread-2Create Thread-3Create Thread-4Thread-0 run 1 time(s)Thread-0 run 2 time(s)Thread-2 run 1 time(s)Thread-2 run 2 time(s)Thread-3 run 1 time(s)Thread-3 run 2 time(s)Thread-4 run 1 time(s)Thread-4 run 2 time(s)Thread-1 run 1 time(s)Thread-1 run 2 time(s)
4.4 Thread mit SingleThreadExecutor starten
SinglethreadExecutor.java
Paket com.zj.concurrency.executors; import java.util.concurrent.executorservice; import Java.util.concurrent.executors; public class SinglethreadExecutor {public static void main (String [] args) {ExecutorService exec = Executors. für (int i = 0; i <5; i ++) exec.execute (neuer MyThread (i)); exec.shutdown (); }} Ergebnis:
Create Thread-0Create Thread-1Create Thread-2Create Thread-3Create Thread-4Thread-0 run 1 time(s)Thread-0 run 2 time(s)Thread-1 run 1 time(s)Thread-1 run 2 time(s)Thread-2 run 1 time(s)Thread-2 run 2 time(s)Thread-3 run 1 time(s)Thread-3 run 2 time(s)Thread-4 run 1 time(s)Thread-4 run 2 time(s)
5. Mit Verwendung der ThreadFactory -Schnittstelle kooperieren
Wir versuchen, dem Thread Daemon- und Prioritätsattributeinstellungen hinzuzufügen.
5.1 Hintergrund -Thread -Eigenschaften festlegen
DaemonThreadfactory.java
Paket com.zj.concurrency.executors.factory; import java.util.concurrent.threadfactory; public class DaemonThreadFactory implementiert ThreadFactory {public thread newThread (runnable r) {Thread t = neuer Thread (r); T.Setdaemon (wahr); return t; }}
5.2 Prioritätsattribute festlegen
MaxpriorityThreadfactory.java
Paket com.zj.concurrency.executors.factory; import java.util.concurrent.threadfactory; öffentliche Klasse MaxPriorityThreadFactory implementiert ThreadFactory {public thread newThread (runnable r) {Thread t = neuer Thread (r); T.SetPriority (thread.max_priority); return t; }} MindestprioritätsminpriorityThreadFactory.java
Paket com.zj.concurrency.executors.factory; import java.util.concurrent.threadfactory; public class MinpriorityThreadFactory implementiert ThreadFactory {public thread newThread (runnable r) {Thread t = neuer Thread (r); T.SetPriority (thread.min_priority); return t; }}
5.3 Thread mit Attributeinstellungen starten
ExecfromFactory.java
Paket com.zj.concurrency.executors; import java.util.concurrent.executorservice; import Java.util.concurrent.executors; com.zj.concurrency.executors.factory.minpriorityThreadfactory; public class execfromfactory {public static void main (String [] args) löst eine Ausnahme aus {ExecutorService defaultExec = Executors.NewCachedThreadpool (); ExecutorService DAEMONEXEC = Executors .NewCachedThreadpool (New DäemonThreadfactory ()); ExecutorService MaxPriorityExec = Executors .NewCachedThreadpool (New MaxPriorityThreadfactory ()); ExecutorService MinpriorityExec = Executors .NewCachedThreadpool (New MinpriorityThreadfactory ()); für (int i = 0; i <10; i ++) Daemonexec.execute (neuer MyThread (i)); für (int i = 10; i <20; i ++) if (i == 10) maxpriorityexec.execute (neuer MyThread (i)); sonst wenn (i == 11) minpriorityexec.execute (neuer MyThread (i)); sonst defaultexec.execute (neuer MyThread (i)); }} Ergebnis:
Erstellen Sie Thread-0create Thread-1Create Thread-2Create Thread-3Thread-0 Führen Sie 1 Zeit (s) Thread-0-Lauf 2 Zeit (s) Thread-1 Rennen 1 Zeit (s) Thread-1 Rennen 2 Zeit (s) Thread-2-Ausführen 1 Zeit (s) Thread-2 Run 2 Zeit Thread-6Create Thread-7Thread-7 run 1 time(s)Thread-7 run 2 time(s)Create Thread-8Thread-8 run 1 time(s)Thread-8 run 2 time(s)Create Thread-9Create Thread-10Thread-10 run 1 time(s)Thread-10 run 2 time(s)Create Thread-11Thread-9 run 1 time(s)Thread-9 run 2 time(s)Thread-6 run 1 time(s)Thread-6 run 2 time(s)Thread-3 run 1 time(s)Thread-3 run 2 time(s)Create Thread-12Create Thread-13Create Thread-14Thread-12 run 1 time(s)Thread-12 run 2 time(s)Thread-13 run 1 time(s)Thread-13 run 2 time(s)Create Thread-15Thread-15 run 1 time(s)Thread-15 run 2 time(s)Create Thread-16Thread-16 run 1 time(s)Thread-16 run 2 time(s)Create Thread-17Create Thread-18Create Thread-19Thread-14 run 1 time(s)Thread-14 run 2 time(s)Thread-17 run 1 time(s)Thread-17 run 2 time(s)Thread-18 run 1 time(s)Thread-18 run 2 time(s)Thread-19 run 1 time(s)Thread-19 run 2 time(s)Thread-11 run 1 time(s)Thread-11 run 2 time(s)