2016-05-06 8 views
1

У меня есть обслуживание на заказ Исполнитель:Run scalaz задачи на пользовательском пуле (ExecutorService)

val executorService = Executors.newSingleThreadExecutor() 

И у меня есть задачи:

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

Я знаю, что я могу передать executorService для каждой задачи:

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

Но что делать, если эти задачи возвращены из какой-либо библиотеки и не созданы моим кодом.

Как я могу запустить tasks используя executorService?

ответ

0

Это может быть сделано с помощью Task.fork:

Возвращает Task, который производит тот же результат, что и данной Future, но вилок его оценка в отдельный (логический) поток, используя данный ExecutorService.

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

Вы уверены, что он также работает в случае задач сцепленных с 'flatMap'? Я прочитал раздел «Конкуренция задач» от http://timperrett.com/2014/07/20/scalaz-task-the-missing-documentation/, и теперь я смущен. – mixel

+0

В большинстве случаев 'Task' будет создан с' Task.now', 'Task.delay' или' Task.async' вместо 'Task.apply', поэтому не будет« прикрепленного »' ExecutionService' , Но в примере с вашими задачами задача будет выполняться в 'executeService', а не на том, который вы передадите' fork' yes (как упоминалось в этом разделе). –

+0

Это не решит проблему. Основная задача по-прежнему выполняется в стандарте ExecutorService. – veegee

 Смежные вопросы

  • Нет связанных вопросов^_^