Мне пришлось использовать тот же «CurrentThreadExecutorService» для целей тестирования, и, хотя все предложенные решения были хорошими (в частности, упомянутое способ Гуавы ), я придумал нечто похожее на то, что предложил Питер Лоури здесь .
Как упомянул Аксель Циглер здесь , к сожалению, решение Питера на самом деле не сработает из-за проверки, введенной в ThreadPoolExecutor
для конструктора maximumPoolSize
параметр (т.е. maximumPoolSize
не может быть <=0
).
Чтобы обойти это, я сделал следующее:
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);
}
};
}