javaconcurrency

How do I call some blocking method with a timeout in Java?


Is there a standard nice way to call a blocking method with a timeout in Java? I want to be able to do:

// call something.blockingMethod();
// if it hasn't come back within 2 seconds, forget it

if that makes sense.

Thanks.


Solution

  • You could use an Executor:

    ExecutorService executor = Executors.newCachedThreadPool();
    Callable<Object> task = new Callable<Object>() {
       public Object call() {
          return something.blockingMethod();
       }
    };
    Future<Object> future = executor.submit(task);
    try {
       Object result = future.get(5, TimeUnit.SECONDS); 
    } catch (TimeoutException ex) {
       // handle the timeout
    } catch (InterruptedException e) {
       // handle the interrupts
    } catch (ExecutionException e) {
       // handle other exceptions
    } finally {
       future.cancel(true); // may or may not desire this
    }
    

    If the future.get doesn't return in 5 seconds, it throws a TimeoutException. The timeout can be configured in seconds, minutes, milliseconds or any unit available as a constant in TimeUnit.

    See the JavaDoc for more detail.