2015-11-26 2 views
6

In Java 8 gibt es zwei Möglichkeiten, asynchrone Berechnungen zu starten - CompletableFuture und ForkJoinTask. Sie scheinen beide ziemlich ähnlich zu sein - die inneren Klassen von CompletableFuture sogar verlängern ForkJoinTask.ForkJoinTask vs CompletableFuture

Gibt es einen Grund, einen über den anderen zu verwenden?

Ein wichtiger Unterschied, dass ich sehen kann, ist, dass die CompletableFuture.join Methode einfach blockiert, bis die Zukunft abgeschlossen ist (waitingGet dreht gerade ein ManagedBlocker verwenden), während ein ForkJoinTask.join Arbeit aus der Warteschlange stehlen kann die Aufgabe, die Sie auf sind Beitritt zu helfen fertigstellen.

Gibt es einen Vorteil gegenüber dem einen oder anderen?

Antwort

3

Sie sind zwei verschiedene Dinge, ForkJoinTask eine Aufgabe, die zu einem ForkJoinPool vorgelegt werden kann, ist CompletableFuture ein Versprechen, das mit jedem Executor und Vollstrecker arbeiten kann nicht die ForkJoinPool sein müssen,

Es ist wahr jedoch, dass die gemeinsame ForkJoinPool der Standard ist, wenn Sie nicht angeben, für die ex:

CompletableFuture.supplyAsync(()-> supplier); 

die ForkJoinPool verwendet, wenn Sie keine Executor passieren. Es gibt eine weitere overload, die eine Executor dauert.

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

Async, die eine static Klasse in CompletableFutureForkJoinTask<Void> erstreckt, aber es muss nicht ein ForkJoinTask, von der Dokumentation von Async

/** Basisklasse sein kann entweder handeln FJ oder schlicht Runnable */

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

Es kann auch ein Runnable und ein AsynchronousCompletionTask

nur auf Randnotiz: ForkJoinTask, ForkJoinPool wurden in 1,7 und nicht 1,8

+0

Ich nehme an, meine Frage ist mehr darüber, wann Sie eine und nicht die andere verwenden würden (vorausgesetzt, Sie verwenden die standardmäßige gemeinsame FJP). Wenn Sie sich einer CompletableFuture anfügen, wird die Aufgabe, der Sie beitreten möchten, unterstützt? – thecoop

+1

@thecoop Ich sehe nicht, wie Sie einen durch den anderen ersetzen können, ComplectableFuture ist ein Versprechen, das eine Operation wie thenApply und thenCompose hat, jetzt, wenn Ihre Frage ist wann verwende ich ForkJoinTask? Ich würde sagen, wenn Sie Ihre eigenen parallelen Algorithmen schreiben –

1
ForkJoin... Klassen hinzugefügt

Ich würde sagen, dass die ForkJoinTask mehr wird empfohlen, wenn Sie eine große Aufgabe haben, und teilen möchten Es läuft parallel in mehreren Unteraufgaben. Das ForkJoin Framework verwendet den Work-Stealing-Algorithmus, der die Threads effizient nutzt. Auf der anderen Seite sind CompletableFutures eher für ein reaktives Programmiermodell geeignet, wo Sie Pipelines der Ausführung in einer synchronen oder asynchronen Weise erstellen können und eine bessere Kontrolle über die Threads haben, indem Sie die Thread-Pools des Executor Service verwenden.

Verwandte Themen