import java.lang.reflect.InvocationTargetException; import java.util.concurrent.*; public class ParallelCaller { public static final int NUM_CORES = 2 * Runtime.getRuntime().availableProcessors(); private ExecutorService eservice = Executors.newFixedThreadPool(NUM_CORES); ; private CompletionService<Object> cservice = new ExecutorCompletionService<>(eservice); public void Parallel(int numtasks, int iterations, Class clazz, Object... args) throws NoSuchMethodException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { long begTest = new java.util.Date().getTime(); for (int index = 1; index <= numtasks; index++) { cservice.submit((Callable<Object>) clazz.getConstructors()[0].newInstance(args)); } eservice.shutdown(); Object taskResult; for (int index = 0; index < numtasks; index++) { try { taskResult = cservice.take().get(); System.out.println("result " + taskResult); } catch (ExecutionException e) { System.out.println(e.getMessage()); } catch (InterruptedException e) { System.out.println(e.getMessage()); // (Re-)Cancel if current thread also interrupted eservice.shutdownNow(); // Preserve interrupt status Thread.currentThread().interrupt(); } } Double secs = new Double((new java.util.Date().getTime() - begTest) * 0.001); System.out.println("run time " + secs + " secs"); } }
Usage:
public static void main(String[] args) throws NoSuchMethodException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { int parallel = args.length > 0 ? Integer.parseInt(args[0]) : 5; int iterations = args.length > 1 ? Integer.parseInt(args[1]) : 100; new ParallelCaller().Parallel(parallel, iterations, LoginTest.class, "http://somethingtotest.com", "testuser02", "testuser02", iterations, LoginTest.KnownDrivers.Firefox); }The referred class should implement Callable.