Was ich suche, ist eine kompatible Möglichkeit, die Verwendung eines Thread-Pools zu konfigurieren oder nicht. Im Idealfall sollte der Rest des Codes überhaupt nicht beeinflusst werden. Ich könnte einen Thread-Pool mit 1 Thread verwenden, aber das ist nicht ganz das, was ich will. Irgendwelche Ideen?
ExecutorService es = threads == 0 ? new CurrentThreadExecutor() : Executors.newThreadPoolExecutor(threads);
// es.execute / es.submit / new ExecutorCompletionService(es) etc
java
concurrency
Michael Rutherfurd
quelle
quelle
AbstractExecutorService
sieht aus wie der Weg zu gehen.Runnable::run
Sie können Guaven verwenden
MoreExecutors.newDirectExecutorService()
oderMoreExecutors.directExecutor()
wenn Sie keine benötigenExecutorService
.Wenn das Einschließen von Guave zu schwer ist, können Sie etwas fast genauso Gutes implementieren:
quelle
Java 8-Stil:
Executor e = Runnable::run;
quelle
Ich schrieb eine
ExecutorService
basierend auf derAbstractExecutorService
.quelle
terminated
Feld @ DaneelS.Yaitskov profitiert nicht vom synchronisierten Zugriff basierend auf dem Code, der tatsächlich hier ist. Operationen an 32-Bit-Feldern sind in Java atomar.Ich musste denselben "CurrentThreadExecutorService" zu Testzwecken verwenden, und obwohl alle vorgeschlagenen Lösungen nett waren (insbesondere die, die den Guaven-Weg erwähnte ), kam ich auf etwas Ähnliches, wie Peter Lawrey hier vorschlug .
Wie von Axelle Ziegler hier erwähnt , funktioniert Peters Lösung leider nicht wirklich, da
ThreadPoolExecutor
dermaximumPoolSize
Konstruktorparameter überprüft wurde (dhmaximumPoolSize
nicht sein kann<=0
).Um dies zu umgehen, habe ich Folgendes getan:
quelle
Sie können den RejectedExecutionHandler verwenden, um die Aufgabe im aktuellen Thread auszuführen.
Sie brauchen immer nur eines davon.
quelle
java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy
.