sollte ExecutorService statisch und global sein

9

Ich möchte den gesamten Threadpool in meiner Anwendung verwenden. Zu diesem Zweck kann ich ExecutorService statisch und global machen, so dass ich ThreadUtil.executorService aufrufen kann, um ExecutorService zu erhalten, wenn ich es brauche.

%Vor%

Ist es in Ordnung, mehrere Thread-Pools so zu inspizieren?

Außerdem ist meine Anwendung ein TCP-Server. Wenn ich nicht weiß, wie groß der Pool sein sollte, ist es in Ordnung, einfach newCachedThreadPool zu verwenden?

    
bylijinnan 20.04.2015, 00:57
quelle

3 Antworten

4

Wenn eine Instanz mit denselben Eigenschaften irgendwo in Ihrem Programm verwendet werden soll, ist es logisch, sie als statisch und final zu deklarieren, anstatt die Instanz jedes Mal neu zu erstellen, aber ich würde mich persönlich für ein Singleton-Muster entscheiden, anstatt direkt zu geben öffentlicher Zugriff auf die Instanz.

Wie für Ihre zweite Abfrage sehe ich kein Problem damit. Der erste Satz der Dokumentation für newCachedThreadPool sagt

  

Erstellt einen Thread-Pool, der bei Bedarf neue Threads erstellt

Da Sie nicht wissen, wie viele Threads erstellt werden, ist dies die logischste Wahl.

Beachten Sie, dass newCachedThreadPool alte Threads wiederverwendet, wenn sie verfügbar sind, um die Leistung zu erhöhen.

    
user2683146 20.04.2015 01:01
quelle
0

Ich würde es nicht direkt global machen. Umschließen Sie es zumindest in einer Klasse, sodass Sie problemlos mehr als einen Pool verwenden können. Ein Pool von Thread-Pools ist sehr nützlich, wenn Sie mehr als eine Art von Jobs / Jobs mit unterschiedlicher Priorität benötigen. Fügen Sie einfach weniger Threads in den anderen Pool und / oder Threads mit niedrigerer Priorität ein (durch Überfahren der Thread-Factory). Für eine Probe sehen Sie Ссылка

Verwendung:

%Vor%

Verwenden Sie auch keinen zwischengespeicherten Pool, da dieser nach Bedarf wachsen kann, keine gute Idee mit TCP, die unbegrenzt blockieren kann. Sie möchten einen kontrollierten Pool verwenden. Die obige Bibliothek kann bei Bedarf neu initialisiert werden (erhöhen Sie die Anzahl der Threads, während aktuelle Jobs verarbeitet werden können, bevor der alte Pool zum GC verworfen wird).

Kann ein Dienstprogramm jsp / servlet für diese Ops wie erstellen Ссылка und Ссылка

    
tgkprog 20.04.2015 11:36
quelle
0

Wenn Sie nur ExecutorServivce für Ihre Anwendung haben, können Sie mit static global fortfahren.

newCachedThreadPool() und newFixedThreadPool() beide bieten keine Kontrolle über die Warteschlange von Callable/Runnable Aufgaben. Sie verwenden eine unbegrenzte Warteschlange , was zu einer Beeinträchtigung der Leistung des Systems führen kann.

Ich bevorzuge ThreadPoolExecutor , das eine bessere Kontrolle bietet auf verschiedenen Parametern wie Queue-Größe, Ablehnung Handler, Thread-Fabrik usw.

%Vor%

Oder

%Vor%

Weitere Informationen finden Sie im folgenden Beitrag:

FixedThreadPool vs CachedThreadPool: das kleinere Übel

    
Ravindra babu 13.11.2015 11:38
quelle