2011-10-13 35 views

Trả lời

19

Giả sử bạn có một bộ các nhiệm vụ A, B, C, D, E và bạn muốn thực hiện mỗi trong số họ không đồng bộ trong một Executor và xử lý kết quả 1 bởi 1 khi chúng hoàn thành.

Với một Executor, bạn sẽ làm như vậy như thế này:

List<Future<?>> futures = new ArrayList<Future<?>>(); 
futures.add(executorService.submit(A)); 
futures.add(executorService.submit(B)); 
futures.add(executorService.submit(C)); 
futures.add(executorService.submit(D)); 
futures.add(executorService.submit(E)); 

//This loop must process the tasks in the order they were submitted: A, B, C, D, E 
for (Future<?> future:futures) { 
    ? result = future.get(); 
    // Some processing here 
} 

Vấn đề với phương pháp này là không có gì bảo đảm rằng nhiệm vụ A sẽ hoàn thành đầu tiên. Vì vậy, có thể là chủ đề chính sẽ được ngăn chặn không hoạt động chờ đợi cho nhiệm vụ A để hoàn thành khi nó có thể được xử lý kết quả của một nhiệm vụ khác (nói nhiệm vụ B). Có thể giảm độ trễ xử lý kết quả bằng cách sử dụng ExecutorCompletionService.

List<Future<?>> futures = new ArrayList<Future<?>>(); 
futures.add(executorCompletionService.submit(A)); 
futures.add(executorCompletionService.submit(B)); 
futures.add(executorCompletionService.submit(C)); 
futures.add(executorCompletionService.submit(D)); 
futures.add(executorCompletionService.submit(E)); 

//This for loop will process the tasks in the order they are completed, 
//regardless of submission order 
for (int i=0; i<futures.size(); i++) { 
    ? result = executorCompletionService.take().get(); 
    // Some processing here 
} 

Vì vậy, về bản chất, ExecutorCompletionService có thể được sử dụng để ép hiệu quả hơn một chút khi thứ tự xử lý kết quả nhiệm vụ không quan trọng.

Một điều quan trọng cần lưu ý. Việc thực hiện ExecutorCompletionService chứa một hàng đợi các kết quả. Nếu take hoặc poll không được gọi là để thoát khỏi hàng đợi đó, một rò rỉ bộ nhớ sẽ xảy ra. Một số người sử dụng số Future được trả lại bởi submit để xử lý kết quả và điều này KHÔNG đúng cách sử dụng.

+0

việc sử dụng chính xác chỉ là để tạo ra tương lai cho mình;) – bestsss

+1

Cảm ơn rất nhiều Tim đã hỗ trợ của bạn. Ví dụ và giải thích rõ ràng. –

+0

Câu trả lời tuyệt vời như vậy và chỉ nhận được 18 phiếu cho đến nay. Điều này khiến tôi buồn. Đứa trẻ đó trông rất dễ thương trong tay bạn. –

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