ผมใช้เดียวกัน "CurrentThreadExecutorService" สำหรับวัตถุประสงค์ในการทดสอบและแม้จะแก้ปัญหาทุกคนมีความสุข (โดยเฉพาะอย่างยิ่งคนที่กล่าวถึงวิธีที่ฝรั่ง ) ฉันมากับสิ่งที่คล้ายกับสิ่งที่ปีเตอร์ Lawrey แนะนำที่นี่
ดังกล่าวโดย Axelle 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);
}
};
}