2015-11-17 3 views
0

Это пример:Как правильно синхронизировать и повторно использовать ForkJoinPool в Java?

Вопрос 1:
Как обеспечить RecursiveTaskA закончена перед вызовом doSomethingElse()?
В настоящее время мое решение:

ForkJoinPool pool = new ForkJoinPool(); 
pool.submit(new RecursiveTaskA()); 

pool.shutdown(); 
pool.awaitTermination(1, TimeUnit.MINUTES); 

// wait the task to finish 
doSomethingElse(); 

Является ли это правильный путь? Или есть лучший способ?
Вопрос 2:
Если я использую решение выше, то pool.submit (new RecursiveTaskB()); ошибки результата. Я не хочу создавать новый ForkJoinPool, как это сделать?

Любая ссылка, ссылка была бы полезной для меня, спасибо.

ответ

1

Если я undertand вашей проблемы правильно, вы можете просто join поданной задача:

RecursiveTaskA taskA = new RecursiveTaskA(); 
pool.submit(taskA); 
taskA.join(); 
doSomethingElse(); 
+0

Таска создает подзадачу рекурсивна, так что я должен позвонить присоединиться() для каждой подзадачи внутри правой? Если я этого не сделаю, кажется, что программа завершается, прежде чем эти подзадачи будут выполнены. –

+0

Правильно написанная 'taskA' должна заканчиваться только тогда, когда все разветвленные подзадачи закончены. Вот почему это задача fork-join: вы сначала используете fork (создайте подзадачи), затем присоединитесь (подождите их, чтобы закончить и объединить результат). Если это не так, подумайте о переписывании 'RecursiveTaskA'. –

+0

Я вижу. Спасибо. –

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