標準の Java API のみを使用したソリューションの大まかなドラフトは、次のようになります。
public class Main {
    private static final Callable<Integer> createCalculationSimulator (final int result, final int minutesToWait) {
        return new Callable<Integer> () {
            @Override
            public Integer call() throws Exception {
                Thread.sleep(minutesToWait*60*1000L);
                return result;
            }
        };
    }
    public static void main(String[] args) throws Exception {       
        final ExecutorService executorService = Executors.newFixedThreadPool (5);
        final long startTime = System.currentTimeMillis();
        final List<Future<Integer>> results = executorService.invokeAll(
            Arrays.asList(
                createCalculationSimulator(1, 5),
                createCalculationSimulator(2, 3),
                createCalculationSimulator(3, 2),
                createCalculationSimulator(4, 4),
                createCalculationSimulator(5, 9)));
        int resultSum = 0;
        for (final Future<Integer> result : results) {
            resultSum += result.get();
        }
        final long endTime = System.currentTimeMillis();
        System.out.println("The end result is " + resultSum + ". Time needed = " + (endTime - startTime)/1000 + " seconds.");
    }
}