Dieses Beispiel teilt den Implementierungscode von Java handgeschriebenem Thread -Pool für Ihre Referenz. Der spezifische Inhalt ist wie folgt
1. Fadenpool ist eine Form des Multi-Threading. Während der Verarbeitung werden die Warteschlange hinzugefügt, und dann werden diese Aufgaben automatisch gestartet, nachdem der Thread erstellt wurde. Thread -Pool -Threads sind alle Hintergrund -Threads.
2. Einfache Thread -Poolarchitektur
3. Einfacher Thread-Pool-Code (Selbstoptimierung)
Importieren Sie java.util.list;/** * Thread Interface * * @author yjian * @date 14:49 2017/10/14 **/public interface iThreadpool {// Task void execute (Runnable Task); // Task void execute (runnable [] Aufgaben); // Task void execute hinzufügen (list <Runnable> Aufgaben); // Thread void zerstören ();} Java.util.LinkedList importieren; import Java.util.list; Import Java.util.concurrent.atomic.atomiclong; ITHREADPOOL {// Die Anzahl der Threads ist standardmäßig statisch int Worker_Number = 5 aktiviert; // Die Anzahl der abgeschlossenen Threads ist statisch flüchtig int sumcount = 0; // Task-Warteschlangenliste ist nicht mit Thread-Sicherheit und kann auf die statische Liste der statischen Blockierung <Runnable> taskQueue = new LinkedList <Runnable> () optimiert werden. // Faden Workgroup WorkerThread [] Workthreads; // Atomic Static Atomiclong Threadnum = New Atomiclong (); statischer ThreadpoolImpl Threadpool; // Konstruktionsmethode public threadPoolImpl () {this (Worker_Number); } public threadPoolImpl (int Workernum) {this.worker_number = Workernum; // Arbeitsthreads für Arbeiter -Thread Space entwickeln = new WorkerThread [Worker_Number]; // Erstellen Sie einen Worker -Thread für (int i = 0; i <Worker_Number; i ++) {Workthreads [i] = new WorkerThread (); Thread Thread = neuer Thread (Workthreads [i], "Threadpool-Arbeiter" + threadnum.incrementandget ()); System.out.println ("Anzahl der Threads initialisieren" + (i + 1) + "----------- Aktueller Threadname:" + Thread.getName ()); Thread.Start (); }} @Override public String toString () {return "Anzahl der Arbeiter -Threads lautet" + Worker_Number + "Anzahl der ausgefüllten Aufgaben" + } // Thread Pool public static iThreadpool getthreadpool () {return getthreadpool (Worker_Number); } public static iThreadpool getthreadpool (int Workernum) {// Fehlertoleranz, wenn weniger als oder gleich 0, ist die Standardzahl der Threads if (Workernum <= 0) {Workernum = Worker_Number; } if (threadpool == null) {threadpool = new threadPoolImpl (Workernum); } return threadpool; } @Override public void execute (runnable task) {synchronized (TaskQueue) {TaskQueue.add (Task); TaskQueue.notifyall (); }} @Override public void execute (runnable [] tasks) {synchronized (TaskQueue) {für (runnable task: tasks) {taskQueue.add (Task); } TaskQueue.notifyAll (); }} @Override public void execute (list <Runnable> tasks) {synchronized (TaskQueue) {für (runnable task: tasks) {TaskQueue.add (Task); } TaskQueue.notifyAll (); }} @Override public void Destroy () {// Wo ist noch eine Aufgabe in der Schleife vorhanden, wenn es 20 Millisekunden der Verarbeitungszeit wartet, während (! TaskQueue.isempty ()) {try {thread.sleep (20); } catch (interruptedException e) {e.printstacktrace (); }} // Wenn die Task -Warteschlange verarbeitet wurde, zerstören Sie den Thread und löschen Sie die Aufgabe für (int i = 0; i <Worker_Number; i ++) {Workthreads [i] .setworkerFlag (); Workthreads [i] = null; } threadpool = null; TaskQueue.clear (); } // Erstellen von Worker Thread Pool Class WorkerThread erweitert Thread {// Die Identifizierung des aktuellen Threads gehört zum aktiven verfügbaren Zustand privat boolean isrunning = true; @Override public void run () {runnable runnable = null; // niemals schleifen, während (isrunning) {// Nicht-Thread-Safe, so synchronisiert (TaskQueue) {while (isrunning && taskQueue.isempty ()) {try {// Wenn die Task-Warteschlange leer ist, warten Sie auf die 20 Millisekunden-Höraufgabe, um TaskQueue.Weait zu erreichen (20); } catch (Ausnahme e) {e.printstacktrace (); }} // Die Task -Warteschlange ist nicht leer, wenn (! TaskQueue.isempty ()) {runnable = taskQueue.remove (0); // die erste Task}} if (runnable! = Null) {runnable.run () erhalten; } sumcount ++; runnable = null; }} // Thread public void setworkerFlag () {isrunning = false; }}} Java.util.ArrayList; import Java.util.list;/** * Testklasse * * @author yjian * @date 15:37 2017/10/14 **/public class threadpoolTest {public static void Main (String [] args) {// Thread Pool ithreadpool t = Threadpoolimpl.Gepool (20); Liste <Runnable> TaskList = New ArrayList <Runnable> (); für (int i = 0; i <100; i ++) {taskList.add (new Task ()); } // Task ausführen t.execute (TaskList); System.out.println (t); // Thread T.Destroy () zerstören; System.out.println (t); } statische Klasse Task implementiert runnable {private statische volatile int i = 1; @Override public void run () {system.out.println ("derzeit verarbeiteter Thread:" + thread.currentThread (). GetName () + "Task ausführen" + (i ++) + "komplett"); }}}Überprüfen Sie nach dem Untersuchung des Federquellcodes sorgfältig, welche Federnutzungsmuster vom Code verwendet werden. Die Spezifikationen für das Schreiben von Programmen sollten mit den Frühling übereinstimmen.
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.