private void runChildren(final RunNotifier notifier) {
        ExecutorService es = Executors.newCachedThreadPool();
        CompletionService<Object> completionService =
                new ExecutorCompletionService<Object>(es);
        for (final Runner each : getChildren()) {
            completionService.submit(new Callable<Object>(){
                @Override
                public Object call() {
                    runChild(each, notifier);
                    return null;
                }
            });
        }
        int n = getChildren().size();
        try {
            for (int i = 0; i < n; i++) {
                try {
                    completionService.take().get();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        } finally {
            es.shutdown();
        }
    }