2012-04-17 11 views
7

Tôi muốn tạo một hồ bơi có kích thước cố định mà không thừa nhận nhiệm vụ nào trong hàng đợi của nó. Nói cách khác, nếu nhóm luồng hiện đang được sử dụng, tác vụ đến sẽ bị từ chối hoàn toàn. Dựa trên documentation, một cách để làm điều này, theo ý kiến ​​của tôi, sẽ là tạo một đối tượng Hàng đợi giả mà từ chối thừa nhận một nhiệm vụ. Cách thành ngữ để thực hiện điều này trong Java là gì?ThreadPoolExecutor mà không có một Queue

Trả lời

10

Bạn có thể sử dụng SynchronousQueue trong ThreadPoolExector của mình, đây là hàng đợi không chứa đối tượng nào. Hồ bơi luồng được lưu trong bộ nhớ cache sử dụng nhóm này vì nó tạo luồng mới theo yêu cầu.

Nếu không thể xếp hàng đợi nhưng tôi khuyên bạn nên sử dụng RejectedExecutionHandler để chạy tác vụ trong chuỗi hiện tại. Bằng cách này, nó sẽ luôn luôn được chạy "ngay lập tức".

BTW: Sẽ hữu ích nếu bạn hiểu rõ lý do tại sao bạn muốn thực hiện việc này.

0

Bạn có thể giải thích tại sao bạn muốn làm một điều như vậy không? Mục đích cơ bản của TP + Q là có một "cơ chế giữ" tự động cho công việc và tách rời các công nhân khỏi quá trình tạo công việc. Nếu ý định của bạn là chỉ có nhiều gói công việc có thể chấp nhận được như công nhân thì bạn không thực sự cần một TPE.

+0

Tác vụ có thể được chọn lên một trình xử lý nhóm khác với chuỗi miễn phí, thay vì chờ trong hàng đợi trước đó. Tôi nên sử dụng những gì thay vì một ThreadPoolExecutor? –

+0

Nếu bạn muốn kiểm soát việc thực thi thì TPE không phải là lựa chọn của bạn. Bạn nên có một bộ sưu tập các chuỗi công việc đơn giản mà bạn có thể thực hiện công việc (nếu chúng có sẵn) một Set đơn giản mà bạn xây dựng và kéo/đẩy đầu vào và ra khỏi chuỗi chính. – vivekv