2013-10-15 5 views
6

Ich verwende LinkedBlockingQueue als Arbeitswarteschlange in ThreadPoolExecutor. Problem ist, soll ich begrenzte LinkedBlockingQueue oder unbegrenzte LinkedBlockingQueue verwenden. Ich habe die Ausführungsmethode von ThreadPoolExecutor außer Kraft gesetzt und nicht länger das Problem der Thread-Erstellung nach Core-Pool-Größe konfrontiert.Welche ist besser LinkedBlockingQueue unbounded oder LinkedBlockingQueue mit Kapazität

Also bitte sagen Sie mir, welche besser LinkedBlockingQueue begrenzt oder unbegrenzt sein wird.

Danke, Tushar

+0

Die Eingabe des entsprechenden Codes könnte uns bei Ihrer Antwort helfen –

+1

Wenn Sie eine begrenzte benötigen, verwenden Sie begrenzt, wenn nicht, verwenden Sie eine unbegrenzte! Was bedeuten Sie für ** besser ** Beide sind eine Sache, auf der Sache ist begrenzt und eine andere ist unbegrenzt! Bitte klären Sie Ihre Frage :) –

+0

Besser bedeutet in Bezug auf CPU-Auslastung, Speicherauslastung und Durchsatz, d. H. Die Gesamteffizienz. Ob Abfrage- und Angebotsoperationen unterschiedliche Leistungsstatistiken für begrenzte und unbegrenzte verknüpfte blockierende Warteschlangen aufweisen. – Scientist

Antwort

4

Unbegrenzte Warteschlange ist sichere Möglichkeit, um sicherzustellen, dass keine Aufgabe abgelehnt wird, oder begrenzte Warteschlange mit einer solchen Kapazität verwenden, die so groß ist, dass sie die maximale Anzahl von Aufgaben in Ihrer Anwendung ausführen kann. Das hängt vom Design Ihrer Anwendung ab. Ich denke, wenn Sie das Anwendungsdesign verstehen (mit dem Architekten besprechen), würden Sie in der Lage sein, über die Größe der Warteschlange zu entscheiden. Und was Speicher und CPU anbelangt, werden sie, wenn Sie der Warteschlange keine Aufgaben hinzufügen, nicht erhöht und sind für beide gleich - unbegrenzt oder beschränkt. (Getestet in Demo-Anwendung)

public static void main(String[] args) 
{ 
    LinkedBlockingQueue<Runnable> r = new LinkedBlockingQueue<Runnable>(11); 

    while(true) 
    { 
    // r.offer(new Task(1)); 
    } 
} 

spielen Sie einfach mit der Größe zu überprüfen.

0

Wenn Sie wie viel maximale Anzahl der ausstehenden Elemente in der Warteschlange sein kann abschätzen kann, wird besser sein beschränktes Warteschlange zu verwenden. Threads, die Elemente in die Warteschlange einfügen, können wissen, ob die Warteschlange nach der geschätzten Warteschlangengröße voll ist.

Dies hängt alles von der Aufgabe ab, die Sie ausführen möchten. Wenn Sie Threads erstellen möchten, die Elemente in die Warteschlange einfügen, um nach der maximalen Anzahl ausstehender Elemente in der Warteschlange zu warten, sollten Sie eine beschränkte Warteschlange in Betracht ziehen.

Eingeschlossene Warteschlangen sind in Bezug auf Speicher und CPU besser, da nur maximal begrenzte Anzahl von Elementen in der Warteschlange sein kann (Speichervorteil) und Threads, die Elemente in die Warteschlange einfügen, warten, wenn die Warteschlange voll ist (CPU Vorteil). Die Gesamtleistung wird verbessert.

Dies hat einen großen Vorteil, wenn die Warteschlangenrate in der Warteschlange nicht der Auslagerungsrate entspricht.

3

Ein unbegrenzter LinkedBlockingQueue ist im Grunde eine begrenzte Warteschlange mit einer Kapazität von java.lang.Integer.MAX_VALUE. Wie in den Kommentaren erwähnt, verwenden Sie also eine beschränkte oder eine unbegrenzte Warteschlange basierend auf Ihren Anforderungen und nicht für die Leistung, da die Größenprüfungen unabhängig davon stattfinden, ob Sie das Limit angeben oder nicht. Wie immer, wenn Sie die Kapazität im Voraus kennen, würde ich empfehlen, eine unbeschränkte Queue-Nutzung gegen eine beschränkte mit der gegebenen Kapazität zu profilieren, obwohl ich diese Route nicht empfehlen würde, wenn Sie nicht beweisen, dass die Queue die verursachende ist Leistungsprobleme in Ihrer Anwendung.