2016-05-06 11 views
1

ich einen benutzerdefinierten Testamentsvollstrecker Service habe:Run scalaz Aufgaben auf individuellen Pool (ExecutorService)

val executorService = Executors.newSingleThreadExecutor() 

Und ich habe Aufgaben:

val tasks = Task(1).flatMap { i => 
    Task(i + 1) 
} 

Ich weiß, dass ich executorService jede Aufgabe passieren kann:

val tasks = Task(1)(executorService).flatMap { i => 
    Task(i + 1)(executorService) 
} 

Aber was ist, wenn diese Aufgaben von einer Bibliothek zurückgegeben werden und nicht von meinem Code erstellt werden. Wie kann ich tasks mit executorService ausführen?

Antwort

0

Dies kann unter Verwendung von Task.fork:

eine Task zurück, der das gleiche Ergebnis wie die gegebene Future erzeugt, aber ihre Bewertung Gabeln ab in einem separaten (logischen) Gewinde, die gegebene ExecutorService verwenden.

val alienTask = Task.delay(5) 
val myExecutorService = Executors.newSingleThreadExecutor() 
val myTask = Task.fork(alienTask)(myExecutorService) 
+0

Sind Sie sicher, dass es funktioniert auch bei Aufgaben mit 'flatMap' gekettet? Ich las "Aufgabe Gleichzeitigkeit" Abschnitt von http://timperrett.com/2014/07/20/scalaz-task-the-missing-documentation/ und jetzt bin ich verwirrt. – mixel

+0

Meistens wird eine 'Task' mit' Task.now', 'Task.delay' oder' Task.async' anstelle von 'Task.apply' erstellt, so dass kein" angehängter "' ExecutionService' vorhanden ist . Aber in Ihrem "Aufgaben" -Beispiel wird die Aufgabe auf dem "executionService" ausgeführt und nicht auf dem, den Sie an "fork" yes übergeben würden (wie in diesem Abschnitt erwähnt). –

+0

Dies löst das Problem nicht. Die zugrunde liegende Task wird weiterhin im Standard ExecutorService ausgeführt. – veegee

Verwandte Themen