public boolean wake() {
    synchronized (lock) {
      if (!isWaiting) {
        return false;
      } else {
        woken = true;
        lock.notify();
        return true;
      }
    }
  }
@Test
  public void should_wait_until_woken() throws ExecutionException, InterruptedException {
    Waiter waiter = new Waiter(Duration.ofMillis(1000));
    Future<Long> waitTime = executor.submit(new WaitForWaiter(waiter));
    sleep(20); // give executor time to get to wait(..)

    waiter.wake();
    assertTrue(waitTime.get() < 100L, "Waited: " + waitTime.get());

    Future<Long> waitTime2 = executor.submit(new WaitForWaiter(waiter));
    sleep(20); // give executor time to get to wait(..)

    waiter.wake();
    assertTrue(waitTime2.get() < 100L, "Waited: " + waitTime2.get());
  }