Dường như không thể tạo nhóm luồng được lưu trong bộ nhớ cache với giới hạn số lượng luồng mà nó có thể tạo.
Đây là cách Executors.newCachedThreadPool được triển khai trong thư viện Java tiêu chuẩn:
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
Vì vậy, sử dụng mẫu đó để tiếp tục tạo nhóm luồng được lưu trong bộ nhớ cache có kích thước cố định:
new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new SynchronusQueue<Runable>());
Bây giờ nếu bạn sử dụng điều này và gửi 3 nhiệm vụ, mọi thứ sẽ ổn. Đệ trình bất kỳ nhiệm vụ hơn nữa sẽ dẫn đến ngoại lệ thực hiện bị từ chối.
Đang thử điều này:
new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runable>());
Sẽ dẫn đến tất cả các chủ đề thực hiện tuần tự. Tức là, nhóm luồng sẽ không bao giờ tạo nhiều hơn một luồng để xử lý các tác vụ của bạn.
Đây là một lỗi trong phương thức thực thi của ThreadPoolExecutor? Hoặc có thể đây là cố ý? Hoặc có một số cách khác?
Chỉnh sửa: Tôi muốn một cái gì đó chính xác như nhóm luồng được lưu trữ (nó tạo ra các luồng theo yêu cầu và sau đó giết chúng sau một khoảng thời gian chờ) nhưng với giới hạn về số lượng luồng mà nó có thể tạo và khả năng tiếp tục xếp hàng các tác vụ bổ sung sau khi có đạt giới hạn chủ đề của nó. Theo phản hồi của sjlee, điều này là không thể. Nhìn vào phương thức exec () của ThreadPoolExecutor thì thực sự không thể. Tôi sẽ cần phải phân lớp ThreadPoolExecutor và ghi đè thực thi () giống như SwingWorker, nhưng những gì SwingWorker thực hiện trong thực thi của nó () là một bản hack hoàn chỉnh.