Tôi đã phải sử dụng cùng một "CurrentThreadExecutorService" cho mục đích thử nghiệm và mặc dù tất cả các giải pháp được đề xuất đều tốt (đặc biệt là giải pháp đề cập đến cách Guava ), tôi đã nghĩ ra một thứ tương tự như những gì Peter Lawrey đề xuất ở đây .
Như được đề cập bởi Axelle Ziegler ở đây , không may là giải pháp của Peter sẽ không thực sự hoạt động vì kiểm tra được giới thiệu ThreadPoolExecutor
trên maximumPoolSize
tham số hàm tạo (tức là maximumPoolSize
không thể được <=0
).
Để phá vỡ điều đó, tôi đã làm như sau:
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);
}
};
}