2013-04-08 8 views
10

Ich bin neu zu ScheduledThreadPoolExecutor (wie ich normalerweise die einfache Timer, aber die Leute haben dagegen beraten), und ich verstehe nicht ganz, was wäre die entsprechende ganze Zahl Wert, der an den ScheduledThreadPoolExecutor(int)-Konstruktor übergeben wird.Bedeutung von 'Core-Pool-Größe' in ScheduledThreadPoolExecutor Konstruktor

Kann jemand das erklären?

Danke

+0

Zum Vergleich: http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledThreadPoolExecutor.html#ScheduledThreadPoolExecutor(int) –

Antwort

1

Wesentlichen die corePoolSize die Anzahl der Threads im Pool zu halten.

z. wenn Sie regelmäßig 10 gleichzeitige Anfragen erwarten, aber Spitzen von 20. Die corePoolSize sollte 10 und maximal 20 sein. Auf diese Weise erstellt der Executor bis zu 10 neue Threads, auch wenn inaktive Threads verfügbar sind.

Wie in dem JavaDocs angegeben

Kern und maximalen Poolgrößen

A ThreadPoolExecutor wird die Poolgröße automatisch anpassen (siehe getPoolSize()) gemäß den von corePoolSize gezogenen Grenzen (siehe getCorePoolSize()) und maximumPoolSize (siehe getMaximumPoolSize()). Wenn eine neue Aufgabe in der Methode execute (java.lang.Runnable) übergeben wird und weniger als corePoolSize-Threads ausgeführt werden, wird ein neuer Thread zur Verarbeitung der Anforderung erstellt, selbst wenn andere Arbeitsthreads inaktiv sind. Wenn mehr als corePoolSize aber weniger als maximumPoolSize-Threads ausgeführt werden, wird nur dann ein neuer Thread erstellt, wenn die Warteschlange voll ist. Indem Sie corePoolSize und maximumPoolSize gleich festlegen, erstellen Sie einen Threadpool mit fester Größe. Indem Sie maximumPoolSize auf einen im Wesentlichen unbegrenzten Wert wie Integer.MAX_VALUE festlegen, ermöglichen Sie, dass der Pool eine beliebige Anzahl gleichzeitiger Aufgaben verarbeiten kann. In der Regel werden die Kern- und die maximale Poolgröße nur bei der Konstruktion festgelegt, sie können jedoch auch dynamisch mithilfe von setCorePoolSize (int) und setMaximumPoolSize (int) geändert werden.

+14

Leider als ThreadPoolExecutor das gleiche dieser Parameter ScheduledThreadPoolExecutor nicht behandeln . STPE fungiert als fester Thread-Pool der Größe 'corePoolSize' und erstellt keine zusätzlichen Threads. maximumPoolSize tut nichts. –

+1

Echo Mike Q Erklärung zu diesem Thema.Scheint so, als wäre Java's Implementierung des ScheduledThreadPoolExecutors in dieser Hinsicht fehlerhaft. Wenn nur eine Kernanzahl übergeben wird, wird die maximale Anzahl in der getMaximumPoolSize-API nicht festgelegt und gibt Integer.MAX_VALUE zurück, was wie eine fehlerhafte API aussieht, wenn core und max immer gleich sein sollen. Warum sollten sie sogar die ThreadPoolExecutor-Schnittstelle implementieren, wenn sie nicht verwendet werden sollte? – Hazok

+0

@Hazok, tatsächlich wird 'maxPoolSize' nicht geändert, aber sein Wert wird von der Implementierung nicht berücksichtigt und die tatsächliche 'corePoolSize' wird als maximale Anzahl von Threads verwendet. – Antoniossss

4

Im Fall ScheduledThreadPoolExecutor ist corePoolSize die maximale Anzahl von Threads, die erstellt werden, um geplante Aktionen auszuführen. Dieser Thread-Pool hat eine feste Größe, und inaktive Threads werden beibehalten.

Antwort Drunkenrabbit ist einfach ivalid weil ScheduledThreadPoolsExecutor docs sagt, dass ausdrücklich (es gibt überhaupt keine Gewinde coun Spikes sein):

Während diese Klasse von ThreadPoolExecutor erbt, einige der geerbt Tuning Methoden sind nicht nützlich für sie. Insbesondere , weil es als ein Pool fester Größe mit corePoolSize Threads und eine unbegrenzte Warteschlange, wirkt Anpassungen an maximumPoolSize haben keinen nützlichen Effekt.

Jetzt wie für den Wert, würde sinnvolle Anzahl von CPU-Kernen sein, auf denen Anwendung läuft.