Es scheint unmöglich zu sein, einen zwischengespeicherten Thread-Pool mit einer Begrenzung der Anzahl der Threads zu erstellen, die er erstellen kann.
So wird statisches Executors.newCachedThreadPool in der Standard-Java-Bibliothek implementiert:
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
Verwenden Sie diese Vorlage, um einen zwischengespeicherten Thread-Pool mit fester Größe zu erstellen:
new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new SynchronusQueue<Runable>());
Wenn Sie dies jetzt verwenden und 3 Aufgaben einreichen, ist alles in Ordnung. Das Senden weiterer Aufgaben führt zu abgelehnten Ausführungsausnahmen.
Versuchen Sie dies:
new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runable>());
Wird dazu führen, dass alle Threads nacheinander ausgeführt werden. Das heißt, der Thread-Pool wird niemals mehr als einen Thread erstellen, um Ihre Aufgaben zu erledigen.
Dies ist ein Fehler in der Ausführungsmethode von ThreadPoolExecutor? Oder ist das vielleicht beabsichtigt? Oder gibt es einen anderen Weg?
Bearbeiten: Ich möchte genau so etwas wie den zwischengespeicherten Thread-Pool (er erstellt Threads bei Bedarf und beendet sie dann nach einer gewissen Zeit), jedoch mit einer Begrenzung der Anzahl der Threads, die er erstellen kann, und der Möglichkeit, weitere Aufgaben in die Warteschlange zu stellen, sobald er vorhanden ist das Thread-Limit erreicht. Nach der Antwort von sjlee ist dies unmöglich. Wenn man sich die execute () -Methode von ThreadPoolExecutor ansieht, ist dies in der Tat unmöglich. Ich müsste ThreadPoolExecutor in eine Unterklasse unterteilen und execute () überschreiben, ähnlich wie SwingWorker, aber was SwingWorker in seiner execute () tut, ist ein vollständiger Hack.