2015-11-26 12 views
6

Java 8'de, eşzamanlı olmayan hesaplamaları başlatmak için iki yol vardır: CompletableFuture ve ForkJoinTask. Her ikisi de oldukça benzer görünüyorlar - CompletableFuture iç sınıfları bile ForkJoinTask'u uzatıyor.ForkJoinTask vs CompletableFuture

Biri diğerinin üzerinde kullanmak için bir neden var mı?

Görebildiğim Temel farklılık CompletableFuture.join yöntem basitçe gelecek tamamlanana blokları kadar yani bir ForkJoinTask.join üzerinde katılmadan konum görevi yardımcı olmak için kuyrukta kapalı çalışmalarını çalabilecek oysa (waitingGet sadece ManagedBlocker kullanılarak spin) Tamamlamak.

Birinden diğerine yarar var mı? Bunlar iki farklı şeydir

cevap

3

, ForkJoinTask bir ForkJoinPool ibraz edilebilecek bir görevdir, CompletableFutureForkJoinPool olması gerekmez herhangi Executor ve uygulayıcısı ile çalışabilir bir söz,

Öyle ise gerçek ancak eski, herhangi belirtmek yoksa ortak ForkJoinPool varsayılan olduğunu: bir Executor geçemiyor eğer

CompletableFuture.supplyAsync(()-> supplier); 

ForkJoinPool kullanır. Executor alan bir overload başka vardır. CompletableFuture bir static sınıf ForkJoinTask<Void> uzanır, ama aynı ya da hareket edebilir Async

/** temel sınıf dokümanlar ile ilgili, bir ForkJoinTask olması gerekmez olan

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

Async, FJ veya düz Runnable */

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

Ayrıcacanve sadece yan not bir AsynchronousCompletionTask

: ForkJoinTask, ForkJoinPool, ForkJoin... sınıflar 1.7 ilave edildi ve değil 1.8

+0

Sanırım sorum başka birini (varsayılan ortak FJP'yi kullandığınızı varsayarak) kullanacağınız zaman diğerini kullanacağınız hakkında daha fazla şey var. Bir CompletableFuture'a katıldığınızda, katıldığınız göreve yardımcı olur mu? – thecoop

+1

@thecoop Birini diğeriyle nasıl değiştirebileceğimi göremiyorum, CompletableFuture o zamanki gibi bir işlemi olan bir sözdür ve sonra Soru, ne zaman ForkJoinTask kullanmalıyım? Kendi paralel algoritmalarını yazarken söyleyebilirim. –

1
Sana büyük bir görev var ve bölmek istediğinizde ForkJoinTask daha önerilir söyleyebilirim

çeşitli alt görevlerde paralel olarak çalışmak. ForkJoin çerçevesi, iş parçacıklarının verimli kullanımını sağlayacak iş çalma algoritmasını kullanır. Diğer yandan, CompletableFutures, bir yürütme ya da uyumsuzluk içinde yürütme boru hatları oluşturabileceğiniz ve iş parçacığı Executor Service'in iş havuzlarını kullanarak daha iyi kontrol edebileceğiniz Reaktif programlama modeli için daha uygundur.

İlgili konular