Мені довелося використовувати той самий "CurrentThreadExecutorService" для цілей тестування, і, хоча всі запропоновані рішення були приємними (особливо той, що згадує про Гуаву ), я придумав щось подібне до того, що запропонував тут Пітер Лоурі .
Як зазначив Аксель Ziegler тут , до жаль , рішення Петра буде на самому ділі не працює з - за перевірки введених в 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);
}
};
}