2013-07-15 5 views
13

Wenn eine neue Aufgabe in Verfahren vorgelegt execute(java.lang.Runnable) und weniger als corePoolSize Threads laufen, ein neuer Thread erstellt wird, um die Anforderung zu verarbeiten, auch wenn andere Worker-Threads im Leerlauf befinden.ThreadPoolExecutor - Kern und maximale Poolgrößen

1) Warum muss ein neuer Thread erstellt werden, um die Anfrage zu bearbeiten, wenn es inaktive Threads gibt?

Wenn es mehr als corePoolSize sind aber weniger als maximumPoolSize Threads ausgeführt wird, ein neuer Thread wird nur erstellt, wenn die Warteschlange voll ist.

2) Ich verstehe den Unterschied zwischen corePoolSize und maximumPoolSize hier nicht. Zweitens, wie kann eine Warteschlange voll sein, wenn Threads weniger als sind? Die Warteschlange kann nur voll sein, wenn die Threads größer oder gleich sind. Ist es nicht?

+1

1. Wie execute() wissen, dass Ihr andere Worker-Threads inaktiv sind? Hast du sie zurück in den Pool gebracht, wenn du damit fertig bist? –

+0

2. Es klingt wie der ThreadPoolExecutor versucht, einen Pool von verwendbaren Threads größer als corePoolSize aber kleiner als maximumPoolSize zu verwalten. –

+0

@RobertHarvey bitte posten dies als Antwort. – zEro

Antwort

8

Die Definition der Begriffe corepoolsize und maxpoolsize finden Sie im Javadoc. http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html

Der Link oben hat die Antwort auf Ihre Frage. Um es jedoch klarzustellen. Die Anwendung erstellt Threads, bis sie die corePoolSize erreicht. Dies bedeutet, dass diese Anzahl von Threads ausreichen sollte, um den Zustrom von Aufgaben zu bewältigen. Danach werden die Aufgaben in die Warteschlange gestellt. Sobald die Warteschlange voll ist, erstellt der Executor neue Threads. Es ist irgendwie ausgleichend. Im Wesentlichen bedeutet dies, dass der Zufluss von Aufgaben mehr ist als die Verarbeitungskapazität. Der Executor beginnt also erneut, neue Threads zu erstellen, bis die maximale Anzahl der Threads erreicht ist. Auch hier werden neue Threads erstellt, wenn die Warteschlange voll ist.

5

Kern und maximale Poolgrößen

A ThreadPoolExecutor wird die Poolgröße entsprechend den Grenzen gesetzt durch corePoolSize und maximumPoolSize automatisch anpassen.

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, auch 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. Wenn Sie corePoolSize und maximumPoolSize gleich festlegen, erstellen Sie einen Threadpool mit fester Größe.

Wenn Sie für maximumPoolSize einen im Wesentlichen unbegrenzten Wert festlegen, z. B. Integer.MAX_VALUE, können Sie zulassen, dass der Pool eine beliebige Anzahl gleichzeitiger Aufgaben unterstützt. In der Regel werden die Kern- und die maximale Poolgröße nur nach der Konstruktion festgelegt. Sie können jedoch auch dynamisch unter Verwendung von setCorePoolSize(int) und setMaximumPoolSize(int) geändert werden. link

+0

Bitte versuchen Sie, Ihre Antwort zu formatieren, um die Lesbarkeit zu verbessern. – harpun

14

Hier sind Suns Regeln für Thread-Erzeugung in einfachen Worten:

  1. Wenn die Anzahl der Threads ist kleiner als die corePoolSize, erstellen Sie einen neuen Thread eine neue Aufgabe auszuführen.
  2. Wenn die Anzahl der Threads gleich (oder größer) als corePoolSize ist, legen Sie die Task in die Warteschlange.
  3. Wenn die Warteschlange voll ist und die Anzahl der Threads kleiner als die maxPoolSize ist, erstellen Sie einen neuen Thread, um Tasks auszuführen.
  4. Wenn die Warteschlange voll ist und die Anzahl der Threads größer oder gleich maxPoolSize ist, lehnen Sie die Aufgabe ab.

Full article

Verwandte Themen