public <T> void notifyReadyAsync(Callable<T> callable, BiConsumer<T, Throwable> handler) {
        workerExecutor.execute(
                () -> {
                    try {
                        T result = callable.call();
                        executorToNotify.execute(() -> handler.accept(result, null));
                    } catch (Throwable t) {
                        executorToNotify.execute(() -> handler.accept(null, t));
                    }
                });
    }
@Test
    public void testBasic() throws InterruptedException {
        CountDownLatch latch = new CountDownLatch(1);
        AtomicInteger result = new AtomicInteger(0);
        notifier.notifyReadyAsync(
                () -> 1234,
                (v, e) -> {
                    result.set(v);
                    latch.countDown();
                });
        latch.await();
        assertEquals(1234, result.get());
    }