Why not just use ScheduledExecutorService instead?
e.g.
public class DeferredCallbackRunner {
private ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
public void register(Duration duration, Runnable task) {
executorService.schedule(task, duration.toMillis(), TimeUnit.MILLISECONDS);
}
}