2016-08-09 16 views
2

Was passiert in einem Java ThreadPoolExecutor in den folgenden zwei verschiedenen Szenarien?Wann sollte der Threadpool mit der festgelegten Größe verwendet werden?

1) Fixed Size ThreadPool 
    CoreThreadPool size = 5 
    MaximumThreadPool size = 5 
    Queue size = unbounded 
Maximum no.of threads that can run simultaneously=? 

2) Variable size ThreadPool 
    CoreThreadPool size = 5 
    MaximumThreadPool size = 10 
    Queue size = unbounded 
Maximum no.of threads that can run simultaneously=? 

Auch wenn beide dieser Fälle zu verwenden?

+0

"Wenn mehr als corePoolSize aber weniger als maximumPoolSize-Threads ausgeführt werden, wird nur dann ein neuer Thread erstellt, wenn die Warteschlange voll ist." - von [ThreadPoolExecutor] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadPoolExecutor.html). Wenn also eine unbeschränkte Warteschlange verwendet wird, wird die Thread-Anzahl über corePoolSize ** im gezeigten Setup von Threadpool mit variabler Größe nie erreicht. – Fildor

Antwort

2

Der einzige Unterschied ist, dass das zweite Setup es Ihnen erlaubt, mit maximal 10 Threads zu laufen; während der erste mit 5 beginnt; und wird nie mehr als das schaffen.

Sie würden das erste Setup verwenden, wenn Sie verstehen, dass Sie nicht mehr Leistung/Durchsatz/... mehr Threads erhalten. Denken Sie jedoch daran, dass feste Größe auch bedeutet: Es wird immer 5 (oder 10) Threads geben. In diesem Sinne ist diese Art von Threadpool am sinnvollsten in einer "statischen" Umgebung; wo sich Ihre "Last" im Laufe der Zeit nicht stark ändert. Sie möchten nicht, dass 5 Threads arbeiten, die für 10 Threads gut sind, aber Sie wollen auch nicht, dass 10 Threads die meiste Zeit im Leerlauf sind, weil 5 gut genug wäre.

Mit anderen Worten: Es hängt sehr viel von Ihrer gesamten Einrichtung ab; Auf den eingehenden Datenverkehr und viele andere Faktoren, wie viele Threads Ihnen "beste" Ergebnisse geben. Im Zweifelsfall sollten Sie also vorsichtiges Profiling durchführen. und testen, was sich ändert eine Variable (wie die maximale Anzahl der Threads) ändert sich für Sie. Aber natürlich: All das erfordert, dass Sie gute Mittel haben, um die Leistung/das Verhalten Ihrer Anwendung zu messen.

+0

Ich würde den Hinweis hinzufügen, dass ein Threadpool fester Größe auch Threads nicht im Leerlauf sterben lassen. Ein _Indikator_ wäre also, wenn Sie (fast) konstante Last erwarten, würden Sie für eine feste Größe gehen. Wenn Sie "Bursts" erwarten ** und ** weitere Threads hilfreich sind, um temporär höhere Ladezeiten zu bewältigen, werden Sie mit variabler Größe arbeiten, sodass Sie nur mehr Threads temporär haben, während die "normale" Last von weniger Threads verarbeitet wird. – Fildor

+0

Danke; Ich habe meine Antwort entsprechend aktualisiert. – GhostCat

Verwandte Themen