title: Why is Java Future.get(timeout) Not Reliable?
body: <p>Future.get(timeout) does not reliably throw the TimeoutException after the given timeout. Is this normal behavior or can I do something to make this more reliable? This test fails on my machine. However if I sleep for 3000 instead of 2000, it will pass.</p>
  
  <pre><code>public class FutureTimeoutTest {
  @Test
  public void test() throws
      ExecutionException,
      InterruptedException {
  
      ExecutorService exec = Executors.newSingleThreadExecutor();
      final Callable call = new Callable() {
          @Override
          public Object call() throws Exception {
               try {
                  Thread.sleep(2000);
              } catch (InterruptedException ex) {
                  ex.printStackTrace();
              }
              return 0;
          }
      };
      final Future future = exec.submit(call);
      try {
          future.get(1000, TimeUnit.MILLISECONDS);
          fail("expected TimeoutException");
      } catch (TimeoutException ignore) {
      }
  }
  </code></pre>
  
  <p>}</p>