Thảo Luận Về ThreadPool Trong Dubbo - nohu tải game nổ hũ club

Trước đây tôi chưa thực sự chú ý đến phần này. Chỉ có một ấn tượng mơ hồ rằng Dubbo đã tự định nghĩa một số thread pool dựa trên ThreadPoolExecutor, nhưng tôi chưa từng xem xét kỹ lưỡng. Lý do chính là vì tôi nghĩ nó nhằm tránh sử kết quả bóng đá hôm nay dụng các thread pool mặc định của JDK (java.util.concurrent.Executors) để phòng tránh những vấn đề tiềm tàng.

Khi xem qua mã nguồn, chúng ta có thể thấy chủ yếu gồm các loại sau:

  1. FixedThreadPool: Tạo ra một thread pool với số lượng thread cố định được tái sử dụng.
 1public Executor getExecutor(URL url) {
 2    String name = url.getParameter("threadname", "Dubbo");
 3    int threads = url.getParameter("threads", 200);
 4    int queues = url.getParameter("queues", 0);
 5    return new ThreadPoolExecutor(
 6        threads, 
 7        threads, 
 8        0L, 
 9        TimeUnit.MILLISECONDS, 
10        (BlockingQueue)(queues == 0 ? new SynchronousQueue() : (queues < 0 ? new LinkedBlockingQueue() : new LinkedBlockingQueue(queues))), 
11        new NamedThreadFactory(name, true), 
12        new AbortPolicyWithReport(name, url)
13    );
14}

Như chúng ta có thể thấy, số lượng thread cốt lõi và tối đa là giống nhau, điều này có nghĩa là sẽ không có sự thay đổi động giữa số lượng thread cốt lõi và tối đa.

  1. LimitedThreadPool: Thread pool này cho phép số lượng thread tăng lên theo nhu cầu, nhưng không vượt quá ngưỡng cấu hình. Các thread rảnh rỗi sẽ không bị thu hồi mà luôn tồn tại.
 1public Executor getExecutor(URL url) {
 2    String name = url.getParameter("threadname", "Dubbo");
 3    int cores = url.getParameter("corethreads", 0);
 4    int threads = url.getParameter("threads", 200);
 5    int queues = url.getParameter("queues", 0);
 6    return new ThreadPoolExecutor(
 7        cores, 
 8        threads, 
 9        9223372036854775807L, 
10        TimeUnit.MILLISECONDS, 
11        (BlockingQueue)(queues == 0 ? new SynchronousQueue() : (queues < 0 ? new LinkedBlockingQueue() : new LinkedBlockingQueue(queues))), 
12        new NamedThreadFactory(name, true), 
13        new AbortPolicyWithReport(name, url)
14    );
15}

Đặc điểm nổi bật ở đây là thời gian giữ sống rất dài, có thể coi là thread sẽ không bao giờ bị thu hồi.

  1. EagerThreadPool: Thread pool này tạo ra các thread mới khi tất cả các thread cốt lõi đang bận, thay vì đưa công việc vào hàng đợi.
 1public Executor getExecutor(URL url) {
 2    String name = url.getParameter("threadname", "Dubbo");
 3    int cores = url.getParameter("corethreads", 0);
 4    int threads = url.getParameter("threads", 2147483647);
 5    int queues = url.getParameter("queues", 0);
 6    int alive = url.getParameter("alive", 60000);
 7    TaskQueue<Runnable> taskQueue = new TaskQueue(queues <= 0 ? 1 : queues);
 8    EagerThreadPoolExecutor executor = new EagerThreadPoolExecutor(
 9        cores, 
10        threads, 
11        (long)alive, 
12        TimeUnit.MILLISECONDS, 
13        taskQueue, 
14        new NamedThreadFactory(name, true), 
15        new AbortPolicyWithReport(name, url)
16    );
17    taskQueue.setExecutor(executor);
18    return executor;
19}

Loại thread pool này có nhiều thay đổi nhất để đạt được cơ chế hoạt động như mong muốn.

  1. CachedThreadPool: Tạo ra một thread pool linh hoạt, trong đó các thread rảnh rỗi trong vòng một phút sẽ bị thu hồi, và khi có yêu cầu mới, thread mới sẽ được tạo ra.
 1public Executor getExecutor(URL url) {
 2    String name = url.getParameter("threadname", "Dubbo");
 3    int cores = url.getParameter("corethreads", 0);
 4    int threads = url.getParameter("threads", 2147483647);
 5    int queues = url.getParameter("queues", 0);
 6    int [nohu tải game nổ  club](/post/31daa020d682cb29.html)  alive = url.getParameter("alive", 60000);
 7    return new ThreadPoolExecutor(
 8        cores, 
 9        threads, 
10        (long)alive, 
11        TimeUnit.MILLISECONDS, [keo da banh](/post/0fb0e70834d975a0.html)  
12        (BlockingQueue)(queues == 0 ? new SynchronousQueue() : (queues < 0 ? new LinkedBlockingQueue() : new LinkedBlockingQueue(queues))), 
13        new NamedThreadFactory(name, true), 
14        new AbortPolicyWithReport(name, url)
15    );
16}

Ở đây, chúng ta có thể thấy rằng số lượng thread cốt lõi là 0, số lượng thread tối đa là 2147483647, và thời gian giữ sống là một phút. Đây chỉ là một giới thiệu đơn giản; nếu bạn quan tâm, hãy đọc thêm mã nguồn chi tiết hơn.