private ForkJoinPool createForkJoinPool(ConfigurationParameters configurationParameters) {
ParallelExecutionConfigurationStrategy strategy = DefaultParallelExecutionConfigurationStrategy.getStrategy(
configurationParameters);
ParallelExecutionConfiguration configuration = strategy.createConfiguration(configurationParameters);
ForkJoinWorkerThreadFactory threadFactory = new WorkerThreadFactory();
return Try.call(() -> {
Constructor<ForkJoinPool> constructor = ForkJoinPool.class.getDeclaredConstructor(Integer.TYPE,
ForkJoinWorkerThreadFactory.class, UncaughtExceptionHandler.class, Boolean.TYPE, Integer.TYPE,
Integer.TYPE, Integer.TYPE, Predicate.class, Long.TYPE, TimeUnit.class);
return constructor.newInstance(configuration.getParallelism(), threadFactory, null, false,
configuration.getCorePoolSize(), configuration.getMaxPoolSize(), configuration.getMinimumRunnable(),
null, configuration.getKeepAliveSeconds(), TimeUnit.SECONDS);
}).orElseTry(() -> {
return new ForkJoinPool(configuration.getParallelism(), threadFactory, null, false);
}).getOrThrow(cause -> new JUnitException("Failed to create ForkJoinPool", cause));
}