Tôi cần triển khai một nhóm luồng trong Java (java.util.concurrent) có số lượng chủ đề ở một giá trị tối thiểu khi không hoạt động, tăng lên đến giới hạn trên (nhưng không bao giờ hơn nữa) khi công việc được gửi vào nó nhanh hơn họ hoàn thành thực hiện, và co lại trở lại giới hạn dưới khi tất cả các công việc được thực hiện và không có thêm công việc được gửi.Tạo hồ bơi chủ đề động (đang phát triển/thu hẹp)
Bạn sẽ triển khai điều gì đó như thế? Tôi tưởng tượng rằng đây sẽ là một kịch bản sử dụng khá phổ biến, nhưng dường như các phương pháp nhà máy java.util.concurrent.Executors
chỉ có thể tạo các hồ bơi và hồ bơi có kích thước cố định phát triển không thành công khi nhiều công việc được gửi. Lớp ThreadPoolExecutor
cung cấp các thông số corePoolSize
và maximumPoolSize
, nhưng tài liệu của nó dường như ngụ ý rằng cách duy nhất để có nhiều hơn corePoolSize
chủ đề cùng một lúc là sử dụng hàng đợi công việc bị ràng buộc, trong trường hợp đó, nếu bạn đã đạt đến chủ đề maximumPoolSize
, bạn sẽ bị từ chối công việc mà bạn phải đối phó với chính mình? Tôi đã đưa ra điều này:
//pool creation
ExecutorService pool = new ThreadPoolExecutor(minSize, maxSize, 500, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<Runnable>(minSize));
...
//submitting jobs
for (Runnable job : ...) {
while (true) {
try {
pool.submit(job);
System.out.println("Job " + job + ": submitted");
break;
} catch (RejectedExecutionException e) {
// maxSize jobs executing concurrently atm.; re-submit new job after short wait
System.out.println("Job " + job + ": rejected...");
try {
Thread.sleep(300);
} catch (InterruptedException e1) {
}
}
}
}
Tôi có thấy gì không? Có cách nào tốt hơn để làm điều này? Ngoài ra, tùy thuộc vào yêu cầu của một người, nó có thể là vấn đề mà các mã trên sẽ không kết thúc cho đến khi ít nhất (tôi nghĩ) (total number of jobs) - maxSize
công việc đã hoàn thành. Vì vậy, nếu bạn muốn có thể gửi một số lượng công việc tùy ý vào hồ bơi và tiến hành ngay lập tức mà không cần đợi bất kỳ công việc nào hoàn thành, tôi không thấy cách bạn có thể làm điều đó mà không có chuỗi "công việc tổng hợp" chuyên dụng hàng đợi không được yêu cầu để giữ tất cả các công việc đã gửi. AFAICS, nếu bạn đang sử dụng một hàng đợi không bị ràng buộc cho chính ThreadPoolExecutor, số lượng chuỗi của nó sẽ không bao giờ phát triển vượt quá corePoolSize.
Tôi phải thừa nhận, tôi không thấy được tính hữu ích của một luồng có kích thước động. Số lượng bộ vi xử lý của bạn trên bảng của bạn có thay đổi trong thời gian hoạt động của ứng dụng của bạn không? – corsiKa
Tại sao 'newCachedThreadPool' không phù hợp với hoàn cảnh của bạn? Nó tự động giết chết các chủ đề không được sử dụng nữa. – Tudor
Điều gì sẽ xảy ra nếu chủ đề nhàn rỗi của bạn không chết? Giả sử bạn có một hồ bơi kích thước cố định có kích thước tối đa mọi lúc? Chuyện gì sẽ xảy ra? –