2013-07-15 40 views
13

Khi tác vụ mới được gửi theo phương pháp execute(java.lang.Runnable) và ít hơn corePoolSize chủ đề đang chạy, một chuỗi mới được tạo để xử lý yêu cầu, ngay cả khi các chuỗi công việc khác không hoạt động.ThreadPoolExecutor - Core và kích thước hồ bơi tối đa

1) Tại sao cần tạo chuỗi mới để xử lý yêu cầu nếu có chuỗi không hoạt động?

Nếu có nhiều hơn corePoolSize nhưng ít hơn maximumPoolSize chuỗi đang chạy, một chuỗi mới sẽ chỉ được tạo khi hàng đợi đầy.

2) Tôi không hiểu sự khác biệt giữa corePoolSizemaximumPoolSize tại đây. Thứ hai, làm thế nào một hàng đợi có thể đầy khi các luồng nhỏ hơn maximumPoolSize? Hàng đợi chỉ có thể đầy nếu chủ đề bằng hoặc lớn hơn maximumPoolSize. Phải không?

+1

1. Làm thế nào để thực hiện() biết rằng đề người lao động khác của bạn là nhàn rỗi? Bạn đã trả lại cho họ trở lại hồ bơi khi bạn đang thực hiện với họ? –

+0

2. Có vẻ như ThreadPoolExecutor đang cố gắng duy trì một nhóm các chủ đề có thể sử dụng lớn hơn corePoolSize nhưng nhỏ hơn maximumPoolSize. –

+0

@RobertHarvey, vui lòng đăng câu trả lời này. – zEro

Trả lời

8

Bạn có thể tìm định nghĩa về các thuật ngữ corepoolsize và maxpoolsize trong javadoc. http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html

Liên kết ở trên có câu trả lời cho câu hỏi của bạn. Tuy nhiên, chỉ để làm cho nó rõ ràng. Ứng dụng sẽ tạo chuỗi cho đến khi nó đạt đến corePoolSize. Nó có nghĩa là số lượng các chủ đề này là đủ để xử lý các luồng công việc. Sau đó nhiệm vụ sẽ được xếp hàng đợi. Khi hàng đợi đầy, người thực thi sẽ bắt đầu tạo các luồng mới. Đó là loại cân bằng. Ý nghĩa cơ bản của nó là dòng chảy của các nhiệm vụ lớn hơn khả năng xử lý. Vì vậy, Executor sẽ bắt đầu tạo chủ đề mới một lần nữa cho đến khi nó đạt đến số lượng tối đa của chủ đề. Một lần nữa, một chủ đề mới sẽ được tạo nếu và chỉ khi hàng đợi đầy.

5

Core và hồ bơi tối đa kích thước

Một ThreadPoolExecutor sẽ tự động điều chỉnh kích thước hồ bơi theo các giới hạn được thiết lập bởi corePoolSize và maximumPoolSize.

Khi một tác vụ mới được gửi theo phương pháp execute(java.lang.Runnable) và ít hơn các luồng corePoolSize đang chạy, một chuỗi mới được tạo để xử lý yêu cầu, ngay cả khi các chuỗi công việc khác không hoạt động. Nếu có nhiều hơn corePoolSize nhưng ít hơn tối đaPoolSize chủ đề chạy, một chủ đề mới sẽ được tạo ra chỉ khi hàng đợi là đầy.Bạn thiết lập corePoolSize và maximumPoolSize giống nhau, bạn tạo một hồ bơi thread kích thước cố định.

Bằng cách đặt tối đaPoolSize thành giá trị không bị ràng buộc cơ bản như Integer.MAX_VALUE, bạn cho phép nhóm chứa một số nhiệm vụ đồng thời tùy ý. Thông thường, kích thước hồ bơi lõi và tối đa chỉ được đặt khi xây dựng, nhưng chúng cũng có thể được thay đổi động bằng cách sử dụng setCorePoolSize(int)setMaximumPoolSize(int). link

+0

Vui lòng định dạng câu trả lời của bạn để cải thiện khả năng đọc. – harpun

14

Dưới đây là quy tắc của Sun để tạo thread trong thuật ngữ đơn giản:

  1. Nếu số lượng bài ít hơn corePoolSize, tạo ra một chủ đề mới để chạy một nhiệm vụ mới.
  2. Nếu số lượng chủ đề bằng (hoặc lớn hơn) corePoolSize, hãy đặt nhiệm vụ vào hàng đợi.
  3. Nếu hàng đợi đầy, và số lượng chuỗi nhỏ hơn maxPoolSize, hãy tạo một chuỗi mới để chạy tác vụ.
  4. Nếu hàng đợi đầy, và số lượng chủ đề lớn hơn hoặc bằng maxPoolSize, hãy từ chối tác vụ.

Full article

Các vấn đề liên quan