wrapping objects such as CompletableFuture and ThreadPoolExecutor to run those threads.
xxxxxxxxxx
CompletableFuture<?>[] completableFutures = runnables.stream()
.map(CompletableFuture::runAsync)
.toArray(CompletableFuture<?>[]::new);
boolean isEveryRunnableDone = CompletableFuture.allOf(completableFutures)
.isDone();
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(5);
runnables.forEach(executor::execute);