public static <T> CompletableFuture<T> run(Callable<T> callable) {
        CompletableFuture<T> result = new CompletableFuture<>();
        CompletableFuture.runAsync(
                () -> {
                    // we need to explicitly catch any exceptions,
                    // otherwise they will be silently discarded
                    try {
                        result.complete(callable.call());
                    } catch (Throwable e) {
                        result.completeExceptionally(e);
                    }
                },
                executor);
        return result;
    }
@Test
    public void testRunException() {

        assertThrows(
                ExecutionException.class,
                () -> {
                    Async.run(
                                    () -> {
                                        throw new RuntimeException("");
                                    })
                            .get();
                });
    }