Musiałem użyć tego samego "CurrentThreadExecutorService" do celów testowych i chociaż wszystkie sugerowane rozwiązania były fajne (szczególnie ta, w której wspomina się o guawie ), wymyśliłem coś podobnego do tego, co zasugerował tutaj Peter Lawrey .
Jak wspomniano przez Axelle Ziegler tutaj , niestety rozwiązanie Piotra nie będą faktycznie pracować z powodu kontroli wprowadzonego ThreadPoolExecutor
na maximumPoolSize
parametrze konstruktora (czyli maximumPoolSize
nie może być <=0
).
Aby to obejść, wykonałem następujące czynności:
private static ExecutorService currentThreadExecutorService() {
CallerRunsPolicy callerRunsPolicy = new ThreadPoolExecutor.CallerRunsPolicy();
return new ThreadPoolExecutor(0, 1, 0L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(), callerRunsPolicy) {
@Override
public void execute(Runnable command) {
callerRunsPolicy.rejectedExecution(command, this);
}
};
}