Tôi đã rối tung xung quanh với các chiến lược khác nhau cho việc tạo nhóm bằng cách sử dụng ThreadPoolExecutor với JDK6. Tôi có một hàng đợi ưu tiên làm việc nhưng không chắc chắn nếu tôi thích cách hồ bơi không kích thước sau khi keepAliveTime (những gì bạn nhận được với một hàng đợi không bị chặn). Vì vậy, tôi đang xem xét một ThreadPoolExecutor bằng cách sử dụng một LinkedBlockingQueue và chính sách CallerRuns.Tại sao ThreadPoolExecutor giảm các chủ đề bên dưới corePoolSize sau keepAliveTime?
Vấn đề tôi gặp phải bây giờ là các hồ bơi dốc lên, vì các tài liệu giải thích rằng nó nên, nhưng sau khi hoàn thành nhiệm vụ và keepAliveTime đi vào getPoolSize cho thấy hồ bơi bị giảm xuống không. Đoạn mã ví dụ dưới đây sẽ cho phép bạn xem cơ sở cho câu hỏi của tôi:
public class ThreadPoolingDemo {
private final static Logger LOGGER =
Logger.getLogger(ThreadPoolingDemo.class.getName());
public static void main(String[] args) throws Exception {
LOGGER.info("MAIN THREAD:starting");
runCallerTestPlain();
}
private static void runCallerTestPlain() throws InterruptedException {
//10 core threads,
//50 max pool size,
//100 tasks in queue,
//at max pool and full queue - caller runs task
ThreadPoolExecutor tpe = new ThreadPoolExecutor(10, 50,
5L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(100),
new ThreadPoolExecutor.CallerRunsPolicy());
//dump 5000 tasks on the queue
for (int i = 0; i < 5000; i++) {
tpe.submit(new Runnable() {
@Override
public void run() {
//just to eat some time and give a little feedback
for (int j = 0; j < 20; j++) {
LOGGER.info("First-batch Task, looping:" + j + "["
+ Thread.currentThread().getId() + "]");
}
}
}, null);
}
LOGGER.info("MAIN THREAD:!!Done queueing!!");
//check tpe statistics forever
while (true) {
LOGGER.info("Active count: " + tpe.getActiveCount() + " Pool size: "
+ tpe.getPoolSize() + " Largest Pool: " + tpe.getLargestPoolSize());
Thread.sleep(1000);
}
}
}
Tôi tìm thấy một lỗi cũ mà dường như là vấn đề này nhưng nó đã được đóng cửa: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6458662. Điều này có thể vẫn còn hiện diện trong 1,6 hoặc tôi thiếu cái gì?
Dường như tôi Rubber Ducked cái này (http://www.codinghorror.com/blog/2012/03/rubber-duck-problem-solving.html). Lỗi tôi liên kết ở trên có liên quan đến lỗi này: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6576792, trong đó vấn đề dường như được giải quyết trong 1,7 (tôi tải lên 1,7 và được xác minh - đã sửa ...). Tôi đoán vấn đề chính của tôi là một lỗi cơ bản này vẫn tồn tại trong gần một thập kỷ. Tôi đã dành quá nhiều thời gian để viết bài này để không đăng nó ngay bây giờ, hy vọng nó sẽ giúp ai đó.
+1 Tìm kiếm thú vị, đã rất ngạc nhiên khi thấy hành vi này. –
Có lẽ sẽ tốt hơn khi cấu trúc bài đăng của bạn dưới dạng câu hỏi và sau đó cung cấp những gì bạn đã học được dưới dạng câu trả lời? –