2017-09-05 1 views
0

wählen Pool Ich habe eine Reihe von Aufgaben:Welche von Java Util gleichzeitig

public class ProcessDay implements Runnable{ 
    @Override 
    public void run(){ 
     List<ProcessHour> hr = //required hours 
     //do some post actions 
    } 
} 

public class ProcessHour implements Runnable{ 
    @Override 
    public void run(){ 
     List<ProcessMinutes> mins = //required minutes 
     //do some post actions 
    } 
} 

ProcessSeconds, ProcessMonth, ... etc Und so weiter. Es wäre praktisch, hier ForkJoinPool zu verwenden, aber es ist vom Standpunkt der Leistung aus nicht gut, weil ProcessXXX Aufgaben einem Cluster von Maschinen übergeben werden und daher der Methodenaufruf selbst sehr kurz ist.

Also für die Leistung ist es gut, Executors.cachedThreadPoolExecutor zu verwenden. Aber gibt es eine Möglichkeit, ForkJoinPool mit chachedThreadPool semantic zu kombinieren. Ich meine Threads bei Bedarf erstellen und sie freigeben, wenn sie nicht verwendet werden.

Vielleicht gibt es einen besseren Ansatz dazu? Kannst du etwas vorschlagen?

Antwort

1

Ich meine Threads bei Bedarf erstellen und sie freigeben, wenn sie nicht verwendet werden.

So funktioniert Cache-Thread-Pool. Es beginnt mit 0 Threads und erstellt jedes Mal ein neues, wenn eine neue Aufgabe zu bearbeiten ist und alle Threads im Pool ausgelastet sind. Der Thread wird beendet, wenn er 60 Sekunden lang inaktiv war. Standard gecachten Thread-Pool wird mit dem folgende ThreadPoolExecutor Konstruktor erstellt:

return new ThreadPoolExecutor(0, 
           Integer.MAX_VALUE, 
           60L, 
           TimeUnit.SECONDS, 
           new SynchronousQueue<Runnable>()) 

es mit 0 möglich, im Leerlauf Fäden in Pool erzeugt, unbegrenzter maximaler Anzahl von Threads, 60 Timeout Sekunden vor Leerlauf-Thread beendet wird, und die Warteschlange Implementierung, die doesn Sie speichern keine Aufgaben und übertragen sie nur zwischen dem Pool und seinen Threads. Ein solcher Pool ist für viele kurzlebige Aufgaben geeignet, was wahrscheinlich der Fall ist. Wie Sie sehen können, ist es auch sehr einfach, die Konfiguration an Ihre Bedürfnisse anzupassen, indem Sie den direkten Konstruktor ThreadPoolExecutor verwenden.

Verwandte Themen