2016-03-20 12 views
5

Tôi đang sử dụng ThreadPoolExecutor như sau:java 8 stucks threadPoolExecutor sau N nhiệm vụ với lệnh return

ThreadPoolExecutor pool = new ThreadPoolExecutor(cores, 50, 30L, 
TimeUnit.SECONDS, new ArrayBlockingQueue<>(10)); 

và:

pool.execute(()->{ 

//code goes here 

if(some condition){ 
    return; 
} 
//code goes here 
}) 

Và khi khối này với lệnh return được kích hoạt, tất cả những nhiệm vụ được bị kẹt trong TPE. TPE nói rằng nó được tải đầy đủ và luôn ném RejectedExecutionException ngoại lệ

Tôi không thể hiểu tại sao điều đó xảy ra. Ví dụ: nếu bạn có một nhóm có kích thước 10 và bạn có 100 nhiệm vụ, 10 trong số đó sẽ khớp nếu phần, bạn sẽ không chấp nhận nhiệm vụ thứ 101, tất cả các tác vụ tiếp theo sẽ bị từ chối. Tại sao?

+0

rất khó để biết điều gì đã xảy ra bởi mô tả này ... là bất kỳ tác vụ đã gửi nào được thực thi? có thể có một số loại lỗi trong mã nhiệm vụ của bạn và chúng đơn giản bị dừng lại ... – nukie

+0

Thực ra bạn sẽ không chấp nhận nhiệm vụ thứ 11 khi hàng đợi có kích thước 10 – Antoniossss

Trả lời

5

Bạn đã không đúng cấu hình của bạn ThreadPoolExecutor

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

Tạo một ThreadPoolExecutor mới với các thông số ban đầu nhất định và nhà máy chủ đề mặc định và từ chối xử lý thực hiện. Nó có thể thuận tiện hơn khi sử dụng một trong các phương thức factory của Executors thay vì constructor có mục đích chung này.

Tham số:

corePoolSize - số chủ đề để giữ trong hồ bơi, ngay cả khi họ đang nhàn rỗi, trừ khi allowCoreThreadTimeOut được thiết lập

maximumPoolSize - số lượng tối đa của chủ đề để cho phép trong hồ bơi

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

unit - đơn vị thời gian cho lập luận KeepAliveTime

workQueue - hàng đợi để sử dụng cho nhiệm vụ giữ trước khi thực hiện. Hàng đợi này sẽ chỉ giữ các nhiệm vụ Runnable được gửi bởi phương thức thực thi.

Tôi chưa bao giờ thấy TPE với kích thước workQueue (10) nhỏ hơn maximumPoolSize (50). Với cấu hình hiện tại của bạn, nhiệm vụ của nhân viên thứ 11 sẽ bị từ chối do kích thước hàng đợi là 10 (kích thước hàng đợi tại thời điểm đó)

Tăng kích thước workQueue để loại bỏ RejectedExecutionException. 50 chủ đề có thể dễ dàng xử lý hơn 1000 nhiệm vụ công nhân nhỏ. Định cấu hình kích thước hàng đợi này tùy thuộc vào yêu cầu của bạn với giá trị hợp lý.

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