2015-11-26 11 views
6

Trong Java 8 có hai cách để bắt đầu tính toán không đồng bộ - CompletableFutureForkJoinTask. Cả hai đều có vẻ tương tự nhau - các lớp bên trong của CompletableFuture thậm chí mở rộng ForkJoinTask.ForkJoinTask vs CompletableFuture

Có lý do nào để sử dụng cái này cho người khác không?

Một khác biệt quan trọng mà tôi có thể thấy là phương pháp đơn giản CompletableFuture.join khối cho đến khi tương lai là đầy đủ (waitingGet chỉ quay sử dụng một ManagedBlocker), trong khi một ForkJoinTask.join có thể ăn cắp công việc ra khỏi hàng đợi để giúp các công việc bạn đang tham gia vào hoàn thành.

Có lợi ích nào khác hay không?

Trả lời

3

Họ là hai việc khác nhau, ForkJoinTask là một nhiệm vụ có thể được gửi đến một ForkJoinPool, CompletableFuture là một lời hứa có thể làm việc với bất kỳ Executor và người thi hành không cần phải là ForkJoinPool,

Đó là tuy nhiên đó phổ biến ForkJoinPool là mặc định nếu bạn không chỉ định bất kỳ, cho ex đúng:

CompletableFuture.supplyAsync(()-> supplier); 

sử dụng ForkJoinPool nếu bạn không vượt qua một Executor. Có một số khác là overload có số Executor.

CompletableFuture.supplyAsync(()-> supplier,executor); 

Async, mà là một lớp static trong CompletableFuture kéo dài ForkJoinTask<Void>, nhưng nó không cần phải là một ForkJoinTask, từ các tài liệu của Async

/** lớp cơ sở có thể đóng vai trò như một trong hai FJ hoặc * đồng bằng Runnable/

abstract static class Async extends ForkJoinTask<Void> 
    implements Runnable, AsynchronousCompletionTask 

Nó cũng có thể một Runnable và một AsynchronousCompletionTask

Chỉ cần trên mặt lưu ý: ForkJoinTask, ForkJoinPool, ForkJoin... lớp đã được thêm vào 1,7 và không 1,8

+0

Tôi cho rằng câu hỏi của tôi là nhiều hơn về thời điểm bạn sử dụng và không phải câu hỏi khác (giả sử bạn đang sử dụng FJP chung mặc định). Khi tham gia vào một CompletableFuture, nó có giúp hoàn thành nhiệm vụ bạn đang tham gia không? – thecoop

+1

@thecoop Tôi không thấy làm thế nào u có thể thay thế một với khác, CompletableFuture là một lời hứa có hoạt động như sau đóApply và sau đóCompose, bây giờ nếu câu hỏi của bạn là khi nào tôi sử dụng ForkJoinTask? Tôi sẽ nói khi bạn viết các thuật toán song song của riêng mình –

1

Tôi muốn nói rằng ForkJoinTask được đề nghị cao hơn khi bạn có một nhiệm vụ lớn và muốn chia nó chạy song song trong một số nhiệm vụ phụ. Khung ForkJoin sử dụng thuật toán đánh cắp công việc sẽ sử dụng hiệu quả các luồng. Mặt khác, CompletableFutures phù hợp hơn với mô hình lập trình phản ứng, nơi bạn có thể tạo đường dẫn thực thi theo kiểu đồng bộ hoặc không đồng bộ, và kiểm soát tốt hơn các luồng bằng cách sử dụng các nhóm luồng của Dịch vụ thực thi.

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