2009-10-05 17 views
16

Số lượng tác vụ (chủ đề) được gửi cũng không lớn trong kịch bản thử nghiệm này.Tại sao Executors.newCachedThreadPool ném java.util.concurrent.RejectedExecutionException trong khi gửi

+2

Bạn có thể tinh chỉnh câu hỏi của mình không? Ví dụ. thêm một testcase ngắn. – Kutzi

+0

Xin lỗi, không có nhiều mã tôi có thể chia sẻ vì lý do IP. Trong vỏ hạt, tôi đang gọi gửi với các loại có thể gọi là . Tôi đang tìm các kịch bản tiềm năng mà điều này có thể xảy ra. –

+1

Bạn đang nói rằng không có kịch bản cụ thể mà bạn đang xem xét, nhưng thay vào đó muốn biết về các kịch bản giả định, nơi ngoại lệ này có thể được ném ra? nếu có, bạn nên viết lại câu hỏi từ 'Tại sao ...' thành 'Khi nào ...' – akf

Trả lời

30

Bạn sẽ cần phải cung cấp mẫu mã như thế nào bạn nhanh chóng và gọi submit trên hồ bơi (IP nên một tổ chức phi Vấn đề ở đây là chúng ta không cần chi tiết của ruột của Callable lớp hoặc bất cứ điều gì giống như của bạn cái đó).

Dựa trên thông tin bạn đã cung cấp, bạn gần như chắc chắn sẽ tắt dịch vụ thực thi ở đâu đó trước khi gửi cuộc gọi đến nó. Kiểm tra xem bạn có thực hiện bất kỳ cuộc gọi nào tới shutdown hoặc shutdownNow và nếu như vậy đảm bảo rằng bạn không thêm công việc sau thời điểm này.

Ngoài ra, bạn có thể muốn đăng ký triển khai của riêng mình java.util.concurrent.RejectedExecutionHandler để hỗ trợ gỡ lỗi; thông điệp rejectedExecution của nó sẽ được gọi bất cứ khi nào người thi hành không thể chấp nhận một nhiệm vụ, vì vậy bạn có thể đặt một số logic kiểm tra trạng thái thô sơ ở đó để giúp bạn tìm ra nguyên nhân.

+0

Bạn đã đúng; Tôi tìm thấy mã đã được tắt hồ bơi thực hiện; cảm ơn –

25

Tôi không thấy bất cứ nơi nào trong yêu cầu của các phương pháp Executors.newCachedThreadPool() trong đó RejectedExecutionException bị ném. Chỉ có ba trường hợp nó dường như được ném trong Java 6:

  • khi gọi execute() trên ThreadPoolExecutor và kích thước hồ bơi tối đa đã đạt tới.
  • khi gọi execute() trên số ThreadPoolExecutor cùng lúc với shutdownNow và về cơ bản đã bị mất cuộc đua với cuộc gọi shutdownNow.
  • khi cố gắng lên lịch thực hiện một lần chạy trong một ScheduledThreadPoolExecutor sau khi người thực hiện đã bị tắt.
+4

+1 để liệt kê tất cả các trường hợp có thể xảy ra –

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