Tôi đang cố gắng viết mã một giải pháp trong đó một luồng duy nhất tạo ra các tác vụ chuyên sâu I / O có thể được thực hiện song song. Mỗi tác vụ có dữ liệu trong bộ nhớ quan trọng. Vì vậy, tôi muốn có thể giới hạn số lượng nhiệm vụ đang chờ xử lý tại một thời điểm.
Nếu tôi tạo ThreadPoolExecutor như thế này:
ThreadPoolExecutor executor = new ThreadPoolExecutor(numWorkerThreads, numWorkerThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(maxQueue));
Sau đó, executor.submit(callable)
ném RejectedExecutionException
khi hàng đợi đầy và tất cả các luồng đã bận.
Tôi có thể làm gì để tạo executor.submit(callable)
khối khi hàng đợi đã đầy và tất cả các luồng đang bận?
CHỈNH SỬA : Tôi đã thử cái này :
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
Và nó phần nào đạt được hiệu quả mà tôi muốn đạt được nhưng theo một cách không phù hợp (về cơ bản các luồng bị từ chối được chạy trong luồng đang gọi, vì vậy điều này chặn luồng gọi gửi thêm).
CHỈNH SỬA: (5 năm sau khi đặt câu hỏi)
Đối với bất kỳ ai đang đọc câu hỏi này và câu trả lời của nó, vui lòng không coi câu trả lời được chấp nhận là một giải pháp đúng. Vui lòng đọc qua tất cả các câu trả lời và nhận xét.