Vorwort
Die vorherigen Artikel konzentrieren sich auf die Optimierung der Back-End-Dienstdatenbank und der parallelen Verarbeitung von Multi-Threaded sowie Beispiele für Pseudocode-Logik vor und nach der Transformation. Natürlich ist die Optimierung endlos. Frühere Generationen pflanzen Bäume und später Generationen genießen den Schatten. Da wir Entwickler, da wir auf den Schultern von Riesen stehen, müssen wir optimiertere Programme schreiben.
Springboot Development Fall Jdbctemplate -Stapelbetrieb
Frühlingsbootentwicklungsfall: Countdownlatch -Multitasking -Parallelverarbeitung
Renovierung
Je mehr Threads theoretisch, je schneller das Programm sein mag, aber in der tatsächlichen Verwendung müssen wir den Ressourcenverbrauch der Thread selbst erstellen und Zerstörung sowie den Zweck des Schutzes des Betriebssystems selbst berücksichtigen. Normalerweise müssen wir Themen auf einen bestimmten Bereich beschränken, und Threadpools spielen diese Rolle.
Programmlogik
Multitasking Parallel + Thread Pool Processing.png
Die Probleme, die durch ein Bild gelöst werden können, sollten so wenig wie möglich sein. Natürlich muss das zugrunde liegende Prinzip noch von allen in Erinnerung bleiben und verstanden werden.
Java -Threadpool
Java bietet vier Arten von Threadpools über Executors, nämlich:
Vorteil
Code -Implementierung
Methode 1 (Countdownlatch)
/*** Multitasking Parallel + Thread Pool Statistik* Erstellungszeit 17. April 2018*/öffentliche Klasse StatsDemo {endgültige statische SimpleDateFormat SDF = new SimpleDateFormat ("yyyy-mm-dd hh: mm: ss"); endgültige statische String startTime = SDF.Format (neues Datum ()); /** * IO-intensive tasks = generally 2*number of CPU cores (often in threads: database data interaction, file upload and download, network data transmission, etc.) * CPU-intensive tasks = generally 1 CPU cores + 1 (often in threads: complex algorithms) * Hybrid tasks = depending on machine configuration and complexity self-test */ private static int corePoolSize = RunTime.getRuntime (). AFFORTEPROCESSORS (); /*** public threadpoolexecutor (int corepoolsize, int maximumpoolsize, long keepalivetime,* Zeiteinheit, Blockingqueue <Runnable> WorkQueue)* Corepoolsize wird verwendet, um die Anzahl der Kernfäden zu angeben. Die Warteschlange des Thread -Pools, und Threads, die noch nicht ausgeführt wurden, warten in der Warteschlange* Überwachungswarteschlangenlänge, um sicherzustellen, dass die gewalte begrenzte Warteschlange* -Rege* -Rege -Größe die Verarbeitungsgeschwindigkeit verlangsamen, die Stabilität verringern und zu Speicherverlust führen kann. Wenn zu wenige Threads konfiguriert sind, wird die Warteschlange weiter größer und verbraucht zu viel Speicher. * Und zu viele Threads verlangsamen die Geschwindigkeit des gesamten Systems aufgrund des häufigen Kontextschalters - und das gleiche Endergebnis wird erreicht. Die Länge der Warteschlange ist entscheidend, sie muss begrenzt werden, sodass der Fadenpool überfordert ist, er kann vorübergehend neue Anforderungen ablehnen. * Die Standardimplementierung von ExecutorService ist ein unbegrenzter Linked -Blocking -Verfahren. */ private statische ThreadPoolexecutor Executor = new ThreadPoolexecutor (Corepoolsize, CorePoolSize+1, 10L, TimeUnit.Seconds, New Linked BlockingQueue <Runnable> (1000)); public static void main (String [] args) löst InterruptedException aus {Countdownlatch Latch = new Countdownlatch (5); // Verwenden Sie die Ausführungsmethode executor.execute (neue Statistiken ("Aufgabe A", 1000, Latch)); Executor.execute (neue Statistiken ("Aufgabe B", 1000, Latch)); Executor.execute (neue Statistiken ("Aufgabe C", 1000, Latch)); Executor.execute (neue Statistiken ("Task D", 1000, Latch)); Executor.execute (neue Statistiken ("Task E", 1000, Latch)); latch.await (); // Warten Sie auf die Aufgabe aller, system.out.println ("Alle statistischen Aufgaben auszuführen, ist abgeschlossen:" + SDF.Format (New Date ())); } statische Klasse -Statistiken implementiert runnable {String statsName; int Runtime; Countdownlatch -Latch; öffentliche Statistiken (String StatsName, int RunTime, Countdownlatch -Latch) {this.statsname = statsName; this.runtime = runtime; this.latch = latch; } public void run () {try {system.out.println (StatsName+ "do statistics beginnt bei"+ starttime); // Aufgabenausführungszeit simulieren Thread.sleep (Laufzeit); System.out.println (StatsName + "do statistics vollständig bei" + SDF.Format (neues Datum ())); latch.countdown (); // Eine einzelne Aufgabe endet, der Zähler wird durch eins reduziert} catch (interruptedException e) {e.printstacktrace (); }}}}Methode 2 (Zukunft)
/*** Multitasking Parallel + Thread Pool Statistik* Erstellungszeit 17. April 2018*/öffentliche Klasse StatsDemo {endgültige statische SimpleDateFormat SDF = new SimpleDateFormat ("yyyy-mm-dd hh: mm: ss"); endgültige statische String startTime = SDF.Format (neues Datum ()); /** * IO-intensive tasks = generally 2*number of CPU cores (often in threads: database data interaction, file upload and download, network data transmission, etc.) * CPU-intensive tasks = generally 1 CPU cores + 1 (often in threads: complex algorithms) * Hybrid tasks = depending on machine configuration and complexity self-test */ private static int corePoolSize = RunTime.getRuntime (). AFFORTEPROCESSORS (); /*** public threadpoolexecutor (int corepoolsize, int maximumpoolsize, long keepalivetime,* Zeiteinheit, Blockingqueue <Runnable> WorkQueue)* Corepoolsize wird verwendet, um die Anzahl der Kernfäden zu angeben. Die Warteschlange des Thread -Pools, und Threads, die noch nicht ausgeführt wurden, warten in der Warteschlange* Überwachungswarteschlangenlänge, um sicherzustellen, dass die gewalte begrenzte Warteschlange* -Rege* -Rege -Größe die Verarbeitungsgeschwindigkeit verlangsamen, die Stabilität verringern und zu Speicherverlust führen kann. Wenn zu wenige Threads konfiguriert sind, wird die Warteschlange weiter größer und verbraucht zu viel Speicher. * Und zu viele Threads verlangsamen die Geschwindigkeit des gesamten Systems aufgrund des häufigen Kontextschalters - und das gleiche Endergebnis wird erreicht. Die Länge der Warteschlange ist entscheidend, sie muss begrenzt werden, sodass der Fadenpool überfordert ist, er kann vorübergehend neue Anforderungen ablehnen. * Die Standardimplementierung von ExecutorService ist ein unbegrenzter Linked -Blocking -Verfahren. */ private statische ThreadPoolexecutor Executor = new ThreadPoolexecutor (Corepoolsize, CorePoolSize+1, 10L, TimeUnit.Seconds, New Linked BlockingQueue <Runnable> (1000)); public static void main (String [] args) löst InterruptedException {list <future <string >> resultlist = new ArrayList <future <string >> () aus; // asynchrone Aufgabe senden und den Rückgabewert als zukünftige Ergebnisliste (executor.submit (neue Statistiken "(" Aufgabe a ", 1000)); resultlist.add (executor.submit (neue Statistiken ("Aufgabe B", 1000)); resultlist.add (executor.submit (neue Statistiken ("Aufgabe C", 1000)); resultList.add (Executor.Submit (neue Statistiken ("Task D", 1000)); resultlist.add (executor.submit (neue Statistiken ("Task E", 1000)); // Ergebnis der Traversal -Aufgabe für (Future <String> fs: resultlist) {try {System.out.println (fs.get ()); // Drucken Sie die Ergebnisse jeder Zeilenaufgabenausführung, um Future.get () zu blockieren und den Haupt -Thread zu blockieren und das Rückkehrergebnis der asynchronen Aufgabe zu erhalten (IntercordException E) {{{printstacktrace (). } catch (executionException e) {e.printstacktrace (); } endlich {// Starten Sie einmal und führen Sie die zuvor eingereichten Aufgaben aus, akzeptieren jedoch keine neuen Aufgaben. Wenn es geschlossen wurde, hat der Anruf keinen anderen Effekt. Executor.Shutdown (); }} System.out.println ("Alle statistischen Aufgaben werden ausgeführt:" + sdf.format (neues Datum ())); } statische Klassenstatistiken implementiert Callable <string> {String StatsName; int Runtime; öffentliche Statistiken (String StatsName, int runTime) {this.statsname = statsName; this.runtime = runtime; } public String call () {try {System.out.println (StatsName+ "do statistics beginnt bei"+ starttime); // Aufgabenausführungszeit simulieren Thread.sleep (Laufzeit); System.out.println (StatsName + "do statistics vollständig bei" + SDF.Format (neues Datum ())); } catch (interruptedException e) {e.printstacktrace (); } return call (); }}}Ausführungszeit
Die oben genannten Codes sind alle Pseudo-Codes, und die folgenden sind echte Testdatensätze von über 2.000 Studenten.
2018-04-17 17: 42: 29.284 Info Test Record 81E51AB031EB4ADA92743DDF66528D82-Single-Threadede-Sequentials Ausführung, Zeit ausgegeben: 3797
2018-04-17 17: 42: 31.452 Info Test Record 81E51AB031EB4ADA92743DDF66528D82-Multi-Thread-Parallelaufgabe, Zeit ausgegeben: 2167
2018-04-17 17: 42: 33.170 Info Test Record 81E51AB031EB4ADA92743DDF66528D82-Multi-Thread-Parallel-Aufgabe + Threadpool, Zeit ausgegeben: 1717
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.