2012-04-30 29 views
33

Khi tiếp tục với số question được đăng bởi tôi, tôi đang cố gắng sử dụng ThreadPoolExecutor trong codebase của mình. Ngay cả sau khi lặp đi lặp lại những nỗ lực để hiểu từ tài liệu API Java, tôi đã không hiểu rõ chức năng/mục đích đằng sau thông số keepAliveTime được truyền trong hàm tạo. Hy vọng ai đó có thể giải thích cho tôi với một số ví dụ làm việc tốt.Keep-alive hoạt động như thế nào với ThreadPoolExecutor?

Trích từ Java doc:

public ThreadPoolExecutor(int corePoolSize, 
          int maximumPoolSize, 
          long keepAliveTime, 
          TimeUnit unit, 
          BlockingQueue<Runnable> workQueue) 

keepAliveTime - khi số lượng các chủ đề lớn hơn cốt lõi, đây là thời gian tối đa mà chủ đề nhàn rỗi dư thừa sẽ chờ đợi cho các nhiệm vụ mới trước khi chấm dứt.

+2

Cũng giống như một điểm của thuật ngữ, bạn đã hai lần sử dụng từ "thực hiện" khi tôi nghĩ rằng bạn chỉ có nghĩa là "sử dụng". Bạn không cố gắng * thực hiện * 'ThreadPoolExecutor' bằng cách viết mã của riêng bạn thực hiện API đó - bạn chỉ đang tạo một' ThreadPoolExecutor' và bạn muốn biết nó sẽ hoạt động như thế nào, đúng không? –

+0

Vâng, bạn nói đúng. Tôi chỉ sử dụng để có nghĩa rằng nó là một loại mới của việc thực hiện trong codebase của tôi. – Gnanam

+0

Nhưng nó không phải là một thực hiện * của * 'ThreadPoolExecutor'. Nó thực sự hữu ích nếu bạn có thể sử dụng thuật ngữ một cách thích hợp - * đặc biệt * trên Stack Overflow. –

Trả lời

47

Giả sử bạn có kích thước lõi là 5 và kích thước tối đa là 15. Vì lý do nào đó, hồ bơi của bạn bận và sử dụng tất cả 15 chuỗi có sẵn. Cuối cùng bạn đã hết công việc để làm - vì vậy một số chủ đề của bạn trở nên nhàn rỗi khi họ hoàn thành nhiệm vụ cuối cùng của họ. Vì vậy, 10 trong số những chủ đề được phép chết.

Tuy nhiên, để tránh chúng bị tiêu diệt quá nhanh, bạn có thể chỉ định thời gian lưu giữ. Vì vậy, nếu bạn đã chỉ định 1 làm giá trị keepAliveTimeTimeUnit.MINUTE làm giá trị unit, mỗi chuỗi sẽ đợi một phút sau khi hoàn tất việc thực hiện tác vụ để xem có cần phải làm thêm không. Nếu nó vẫn chưa được làm thêm nữa, nó sẽ tự hoàn thành, cho đến khi chỉ có 5 chủ đề trong hồ bơi - "cốt lõi" của hồ bơi.

+2

Nếu tôi hiểu điều này một cách chính xác, 'keepAliveTime' được sử dụng/hiệu quả" chỉ "khi các chủ đề trong nhóm có nhiều hơn kích thước lõi. Điều này là * không * áp dụng khi các chủ đề trong hồ bơi nằm dưới kích thước lõi. – Gnanam

+0

Xin lỗi, nếu câu hỏi này quá cơ bản. Nhưng tại sao chúng ta muốn giữ các chủ đề còn sống mà thực sự đã hoàn thành việc thực hiện một nhiệm vụ? Nhưng dù sao, số lượng chủ đề tối đa ('maximumPoolSize') được phép trong hồ bơi có hạn chế phải không? – Gnanam

+2

Điểm giết chết chủ đề cũng giống như điểm của việc có một hồ bơi chủ đề ở nơi đầu tiên - không lãng phí các nguồn lực không cần thiết. –

3

Dưới đây là một số mô tả nhiều hơn từ Javadoc:

<dt>Keep-alive times</dt> 
* 
* <dd>If the pool currently has more than corePoolSize threads, 
* excess threads will be terminated if they have been idle for more 
* than the keepAliveTime (see {@link 
* ThreadPoolExecutor#getKeepAliveTime}). This provides a means of 
* reducing resource consumption when the pool is not being actively 
* used. If the pool becomes more active later, new threads will be 
* constructed. This parameter can also be changed dynamically 
* using method {@link ThreadPoolExecutor#setKeepAliveTime}. Using 
* a value of <tt>Long.MAX_VALUE</tt> {@link TimeUnit#NANOSECONDS} 
* effectively disables idle threads from ever terminating prior 
* to shut down. 
* </dd> 
* 

Về cơ bản này chỉ cho phép bạn kiểm soát số lượng các đề còn lại trong hồ bơi nhàn rỗi. Nếu bạn thực hiện điều này quá nhỏ (đối với những gì bạn đang làm), bạn sẽ tạo quá nhiều luồng. Nếu bạn làm cho nó quá lớn, bạn sẽ tiêu thụ bộ nhớ/chủ đề mà bạn không cần.

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