package org.minperf.generator;

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;

/**
 * A tool that either runs tasks one after the other (in the caller thread), or
 * uses a ForkJoinPool to run the tasks in parallel.
 */
public class ConcurrencyTool {

    private final ForkJoinPool pool;

    public ConcurrencyTool(int parallelism) {
        if (parallelism > 1) {
            pool = new ForkJoinPool(parallelism);
        } else {
            pool = null;
        }
    }

    public <T> T invoke(ForkJoinTask<T> task) {
        if (pool != null) {
            return pool.invoke(task);
        }
        return task.invoke();
    }

    public void invokeAll(ForkJoinTask<?>... tasks) {
        if (pool != null) {
            ForkJoinTask.invokeAll(tasks);
            return;
        }
        for (ForkJoinTask<?> t : tasks) {
            t.invoke();
        }
    }

    public void shutdown() {
        if (pool != null) {
            pool.shutdown();
        }
    }

}