private List<TaskRunnable> createPostProcessingTasks(final Queue<JobAndResult> resultQueue,
final TaskListener finishedTaskListener) {
final List<RowProcessingConsumer> configurableConsumers = getConsumers();
final int numConsumers = configurableConsumers.size();
final JoinTaskListener closeTaskListener = new JoinTaskListener(numConsumers, finishedTaskListener);
final List<TaskRunnable> closeTasks = new ArrayList<>();
for (final RowProcessingConsumer consumer : configurableConsumers) {
closeTasks.add(createCloseTask(consumer, closeTaskListener));
}
final TaskListener getResultCompletionListener =
new ForkTaskListener("collect results (" + getStream() + ")", getTaskRunner(), closeTasks);
final TaskListener getResultTaskListener = new JoinTaskListener(numConsumers, getResultCompletionListener);
final List<TaskRunnable> getResultTasks = new ArrayList<>();
for (final RowProcessingConsumer consumer : configurableConsumers) {
final Task collectResultTask = createCollectResultTask(consumer, resultQueue);
if (collectResultTask == null) {
getResultTasks.add(new TaskRunnable(null, getResultTaskListener));
} else {
getResultTasks.add(new TaskRunnable(collectResultTask, getResultTaskListener));
}
}
return getResultTasks;
}