Tôi đang cố gắng sử dụng một ThreadPoolExecutor để lên lịch các nhiệm vụ, nhưng gặp phải một số vấn đề với các chính sách của nó. Đây là hành vi đã nêu của nó:ThreadPoolExecutor policy
- Nếu ít hơn corePoolSize chủ đề đang chạy, Executor luôn thích thêm một chuỗi mới thay vì xếp hàng.
- Nếu corePoolSize hoặc nhiều chủ đề đang chạy, Executor luôn thích xếp hàng một yêu cầu hơn là thêm một chuỗi mới.
- Nếu yêu cầu không thể được xếp hàng đợi, một chuỗi mới sẽ được tạo trừ khi điều này vượt quá tối đaPoolSize, trong trường hợp đó, tác vụ sẽ bị từ chối.
Các hành vi tôi muốn là thế này:
- tương tự như trên
- Nếu có nhiều hơn corePoolSize nhưng ít hơn đề maximumPoolSize đang chạy, thích thêm một chủ đề mới hơn xếp hàng, và sử dụng một chủ đề nhàn rỗi hơn việc thêm một chuỗi mới.
- giống như trên
Về cơ bản tôi không muốn bất kỳ tác vụ nào bị từ chối; Tôi muốn họ được xếp hàng đợi trong một hàng đợi vô biên. Nhưng tôi muốn có tối đa chủ đềPoolPoolize. Nếu tôi sử dụng một hàng đợi không bị chặn, nó sẽ không bao giờ tạo ra các luồng sau khi nó truy cập coreSize. Nếu tôi sử dụng hàng đợi bị chặn, nó sẽ từ chối nhiệm vụ. Có cách nào để khắc phục điều này?
Điều tôi đang nghĩ bây giờ là chạy ThreadPoolExecutor trên SynchronousQueue, nhưng không cho phép tác vụ trực tiếp vào nó - thay vào đó hãy cho chúng vào một LinkedBlockingQueue không bị ràng buộc riêng biệt. Sau đó, một luồng khác được cung cấp từ LinkedBlockingQueue vào Executor, và nếu một bị từ chối, nó chỉ đơn giản là cố gắng một lần nữa cho đến khi nó không bị từ chối. Điều này có vẻ giống như một cơn đau và một chút của một hack, mặc dù - là có một cách sạch hơn để làm điều này?
Rất tiếc, những gì tôi viết không chính xác những gì tôi muốn. Tôi đã chỉnh sửa bản gốc. –
Thiết lập corePoolsize = maximumPoolSize thực sự là gần, nhưng tôi cũng sử dụng allowCoreThreadTimeOut (false) và prestartAllCoreThreads(). –