MultiThreading Vs ThreadPoolExecutor

7

Ich habe Multithreading in vielen meiner Anwendungen verwendet. Während ich mehr las, stieß ich auf ThreadPoolExecutors . Ich konnte nicht zwischen den beiden Szenarien unterscheiden.

Ich verstehe immer noch, dass ich Multithreading verwenden sollte, wenn ich eine Aufgabe habe, die ich in mehrere kleine Aufgaben aufteilen möchte, um die CPU zu nutzen und die Arbeit schneller zu erledigen. Und benutze ThreadPoolExecutor , wenn ich auf Aufgaben eingestellt bin und jede Aufgabe unabhängig voneinander ausgeführt werden kann.

Bitte korrigieren Sie mich, wenn ich falsch liege. Danke

    
Pit Digger 22.09.2012, 20:17
quelle

5 Antworten

17

A ThreadPoolExecutor ist nur eine API auf hoher Ebene, mit der Sie Tasks in mehreren Threads ausführen können, ohne sich mit der Thread API auf niedriger Ebene befassen zu müssen. Es ist also nicht wirklich sinnvoll zwischen Multithreading und ThreadPoolExecutor zu unterscheiden.

Es gibt viele Varianten von ThreadPoolExecutor s, aber die meisten von ihnen erlauben mehr als einen Thread parallel zu laufen. Normalerweise würden Sie einen Executor Service verwenden und den Executors factory.

Beispiel: ExecutorService executor = Executors.newFixedThreadPool(10); führt die Aufgaben aus, die Sie in 10 Threads einreichen.

    
assylias 22.09.2012, 20:29
quelle
9

ThreadPoolExecutor ist eine Möglichkeit Multithreading durchzuführen. Es wird normalerweise verwendet, wenn Sie

  1. haben unabhängige Operationen, die keine Koordination erfordern (obwohl nichts Sie hindert von der Koordinierung, aber Sie müssen vorsichtig sein)
  2. möchte die Kapazität von Operationen, die Sie gleichzeitig ausführen, begrenzen und (optional) Operationen zur Ausführung in die Warteschlange stellen, wenn der Pool momentan in allen Threads funktioniert.

Java 7 hat eine weitere eingebaute Klasse namens ForkJoinPool , die normalerweise für Map-Reduce-Operationen verwendet wird. Zum Beispiel kann man sich vorstellen, eine Merge-Sortierung unter Verwendung eines ForkJoinPools zu implementieren, indem das Array an jedem Verzweigungspunkt in 1/2 geteilt wird, auf die Ergebnisse gewartet wird und die Ergebnisse zusammengeführt werden.

    
Matt 22.09.2012 21:19
quelle
6

Thread-Pools (Executoren) sind eine Form von Multithreading, speziell eine Implementierung des Single-Producer-Multiple-Consumer-Musters, bei der ein Thread wiederholt Arbeit in eine Warteschlange für ein Team von Worker-Threads zur Ausführung bringt. Es wird mit regulären Threads implementiert und bringt mehrere Vorteile:

  • Thread-Anonymität - Sie kontrollieren nicht explizit, welcher Thread was tut; feuern Sie Aufgaben ab und sie werden vom Pool bearbeitet.
  • Es kapselt eine Arbeitswarteschlange und ein Thread-Team ein - Sie müssen sich nicht darum kümmern, Ihre eigene thread-sichere Warteschlange und Threads zu implementieren.
  • Load-Balancing - Da die Mitarbeiter neue Aufgaben übernehmen, während sie die vorherigen beenden, wird die Arbeit gleichmäßig verteilt, vorausgesetzt, es gibt eine ausreichend große Anzahl von Aufgaben.
  • thread recycling - einfach zu Beginn einen einzigen Pool anlegen und ihm Aufgaben zuführen. Es ist nicht nötig, jedes Mal, wenn die Arbeit erledigt werden muss, weiter zu starten und die Threads zu löschen.

Vor diesem Hintergrund ist es richtig, dass Pools für Aufgaben geeignet sind, die normalerweise voneinander unabhängig und in der Regel kurzlebig sind (lange I / O-Operationen binden nur Threads aus dem Pool, die nicht in der Lage sind) andere Aufgaben erledigen).

    
Tudor 22.09.2012 21:17
quelle
1

ThreadPoolExecutor ist eine Form des Multithreading, mit einer einfacheren API als die direkte Verwendung von Threads, wo Sie tatsächlich Aufgaben übergeben. Aufgaben können jedoch andere Aufgaben übermitteln, sodass sie nicht unabhängig sein müssen. Was die Aufgabenteilung in Teilaufgaben betrifft, denken Sie vielleicht an die neue fork / join API in JDK7.

    
Frank Pavageau 22.09.2012 20:28
quelle
1

Aus der Quellcodedokumentation von ThreadPoolExecutor

%Vor%

ThreadPoolExecutor ist eine Möglichkeit, Nebenläufigkeit zu erreichen. Es gibt viele Möglichkeiten, Nebenläufigkeit zu erreichen:

Executors bietet verschiedene APIs. Einige wichtige APIs sind unten aufgeführt.

%Vor%
  

Erzeugt einen Thread-Pool, der eine festgelegte Anzahl von Threads wiederverwendet, die von einer gemeinsam genutzten, nicht verbundenen Warteschlange aus arbeiten.

%Vor%
  

Erstellt einen Thread-Pool, der bei Bedarf neue Threads erstellt, aber zuvor erstellte Threads wieder verwendet, wenn sie verfügbar sind.

%Vor%
  

Erzeugt einen Thread-Pool, der Befehle zur Ausführung nach einer bestimmten Verzögerung oder zur periodischen Ausführung planen kann.

%Vor%
  

Erstellt einen Work-Stealing-Threadpool mit allen verfügbaren Prozessoren als Zielparallelitätsebene.

Sehen Sie sich unter SE Fragen an:

Java Fork / Join-Pool, ExecutorService und CountDownLatch

Wie verwende ich Java Executor richtig?

    
Ravindra babu 29.02.2016 03:37
quelle