Vor kurzem habe ich eine neue Anforderung im Projekt gestoßen, bei der eine Funktion implementiert wird, die zeitgesteuerte Aufgaben dynamisch hinzufügen kann. Apropos, manche Leute mögen sagen, es sei einfach, benutze einfach Quarz, es ist einfach und grob. Das Quartz -Framework ist jedoch zu schwer und kleine Projekte sind nicht einfach zu bedienen. Natürlich können einige Leute sagen, dass JDK eine Timer -Schnittstelle bietet, die völlig ausreicht. Die Anforderungen unseres Projekts sind jedoch vollständig multi-thread-Modelle, während der Timer Single-Threaded ist und der Autor schließlich den Thread-Pool von JDK ausgewählt hat.
Was ist ein Fadenpool
Java bietet vier Arten von Threadpools über Executors, nämlich:
NewcachedThreadpool: Erstellen Sie einen zwischengespeicherbaren Thread -Pool. Wenn die Länge der Gewindepool die Verarbeitungsanforderungen überschreitet, können Sie die Leerlauffäden flexibel recyceln. Wenn es keinen Recycling gibt, erstellen Sie einen neuen Thread.
NeufixedThreadpool: Erstellt einen Thread-Pool mit fester Länge, mit dem die maximale Anzahl von Threads gleichzeitig steuern kann, und die überschüssigen Threads warten in der Warteschlange.
NewScheduledThreadpool: Erstellt einen Thread-Pool mit fester Länge, der zeitgesteuerte und regelmäßige Aufgabenausführung unterstützt.
NewsingLethreadExecutor: Erstellt einen Thread-Pool mit einem Thread, der nur einen einzigartigen Worker-Thread verwendet, um Aufgaben auszuführen, um sicherzustellen, dass alle Aufgaben in der angegebenen Reihenfolge ausgeführt werden (FIFO, LIFO, Priorität).
Das Poster verwendet Newsschoned threadpool im Projekt. Das ist alles. Egal wie viele Poster Sie sind, Sie werden Ihre Fähigkeiten zeigen. Google es und es ist viel.
Thread -Pool -Service erhalten
Der Autor verwendet den Singleton -Modus, um den Dienst des Thread -Pools zu erhalten. Der Code ist wie folgt:
/*** Thread Pool -Erstellung. * @Author Wuhf * @date 2018/01/16 */public class threadpoolutils {private statische plandexecutorService -ExecutorService; private threadpoolutils () {// manuell Threadpool erstellen. ExecutorService = New Schedulled threadpoolexecutor (10, New theadfactory.builder (). NamingPattern ("SyncData-Schedule-Pool-%d"). Dämon (true) .build ()); } private statische Klasse Pluginconfigholder {private endgültige statische ThreadPoolutils Instance = new threadPoolutils (); } public static threadPoolutils getInstance () {return pluginconfigholder.instance; } public plantedexecutorService getthreadpool () {return ExecutorService; }}Unterbrechung einer laufenden Threadcode -Implementierung
Ich werde nicht viel Unsinn sagen, der Code ist wie folgt:
/*** Eine Aufgabe im Thread -Pool wird unterbrochen. */public class interruptthread implements runnable {private int num; public interruptThread (int num) {this.num = num; } public static void main (String [] args) löst InterruptedException aus {Thread interruptthread = neuer Thread (neuer InterruptThread (1)); Planedfuture <?> T = threadpoolutils.getInstance (). Getthreadpool (). ScheduleatFixedRate (InterruptThread, 0,2, TimeUnit.Seconds); InterruptThread InterruptThread1 = neuer InterruptThread (2); Threadpoolutils.getInstance (). Getthreadpool (). ScheduleatFixedRate (InterruptThread1,0,2, TimeUnit.Seconds); InterruptThread InterruptThread2 = neuer InterruptThread (3); Threadpoolutils.getInstance (). Getthreadpool (). ScheduleatFixedRate (InterruptThread2,0,2, TimeUnit.Seconds); Thread.sleep (5000); // laufende Thread InterruptThread t.cancel (true); while (true) {}} @Override public void run () {System.out.println ("Dies ist ein Thread" + num); }}Eingefangener Aufzeichnung
Als das Poster den folgenden Code verwendete, überlegte er plötzlich darüber, wie der Thread ausführen sollte, wenn diese Zeitaufgabe gestoppt werden muss.
Threadpoolutils.getInstance (). Getthreadpool (). ScheduleatFixedRate (InterruptThread, 0,2, TimeUnit.seconds);
Da ich so einen Bedarf habe, lassen Sie uns es googeln. Nachdem ich die meiste Zeit nach der Suche nach der Suche nach relevanten Informationen fand. Sie waren alle eingehende Analyse des Java-Threadpools. Oder globale Variablen oder etwas, es wurde keine Lösung gefunden, um den Autor zu befriedigen.
Da es keinen Thread gibt, schauen wir uns den zugrunde liegenden Quellcode von ScheduleatFixedrate an, um zu sehen, was es ist. Wie erwartet habe ich die spezifische Implementierung der ScheduleatFixedRate -Methode im Quellcode gesehen und festgestellt, dass der Rückgabewert geplant ist.
public afuledfuture <?> enderUleatfixedrate (Runnable -Befehl, Long InitialdElay, lange Periode, Zeitunit -Einheit) {if (command == null || unit == null) Wirf eine neue NullPointerException (); if (Periode <= 0) neue illegalArgumentException () werfen; AfulEdFuturetask <void> sft = new ScheduledFuturetask <void> (Befehl, Null, Triggertime (InitialdElay, Einheit), Einheit.Tonanos (Periode)); RunnableScheduledFuture <void> t = decorateTask (Befehl, SFT); sft.outertask = t; verzögertedexezute (t); return t; }Schauen wir uns dann an, was sich in der geplanten Future befindet. Es hat das Poster nicht enttäuscht, und ich habe das gesehen
public boolean stornieren (boolean Maiinterruptifrunning) {boolean storniert = super.cancel (MaiinterruptiFrunning); if (storniert && removeoncancel && heapindex> = 0) entry (this); Rückgabe storniert;} // Entfernen Sie den aktuellen Thread aus der ausführenden Warteschlange öffentlich boolean (Runnable Task) {boolean entfernt = WorkQueue.remove (Aufgabe); tryterminate (); // falls heruntergefahren und jetzt leer zurückgezogen;}Überprüfen Sie, was Super.cancel (makitlich) ist. Wir sehen das.
// Stoppen Sie den Thread, der ausgeführt wird, indem Sie die Interrupt -Methode des Threads öffentlich boolean abbrechen (boolean MaiinterruptiFrunning) {if (! (State == new && unsicher.comPareAndswapint (this, stateOffset, neu, macinruptiFrunning? Unterbrechung: Storniert)) zurückzusetzen. Versuchen Sie {// Falls Call to Interrupt löst eine Ausnahme aus, wenn (MaiInterruptiFrunning) {try {Thread t = Runner; if (t! = null) t.interrupt (); } endlich {// endgültiger Status unsicher.putorderedInt (this, StateOffset, unterbrochen); }}} endlich {finiscCompletion (); } Return true; }Alle Probleme hier sind gelöst.
Lassen Sie uns zusammenfassen
Es gibt immer schwierige Lösungen in Projekten. Wenn Google nicht einfach zu finden ist, ist dies möglicherweise eine gute Möglichkeit, nach dem Quellcode von JDK zu suchen.