import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; import static java.util.concurrent.TimeUnit.*; public class TimeUnitTest3 { public TimeUnitTest3() { ExecutorService e = Executors.newSingleThreadExecutor(); Executors.execute(e, new Task(this)); synchronized (this) { try { MILLISECONDS.timedWait(this, 1000L); System.out.println("Woke Up."); } catch (InterruptedException ex) { ex.printStackTrace(); } } e.shutdown(); } class Task implements Runnable { private Object target; public Task(Object target) { this.target = target; } public void run() { try { Thread.sleep(500L); System.out.println("Wake Up!"); synchronized (target) { target.notifyAll(); } } catch (InterruptedException ex) { System.out.println("Task is Canceled"); return; } } } public static void main(String[] args) { new TimeUnitTest3(); } }