Search code examples
javatimer

How to set a Timer in Java?


How to set a Timer, say for 2 minutes, to try to connect to a Database then throw exception if there is any issue in connection?


Solution

  • So the first part of the answer is how to do what the subject asks as this was how I initially interpreted it and a few people seemed to find helpful. The question was since clarified and I've extended the answer to address that.

    Setting a timer

    First you need to create a Timer (I'm using the java.util version here):

    import java.util.Timer;
    

    ..

    Timer timer = new Timer();
    

    To run the task once you would do:

    timer.schedule(new TimerTask() {
      @Override
      public void run() {
        // Your database code here
      }
    }, 2*60*1000);
    // Since Java-8
    timer.schedule(() -> /* your database code here */, 2*60*1000);
    

    To have the task repeat after the duration you would do:

    timer.scheduleAtFixedRate(new TimerTask() {
      @Override
      public void run() {
        // Your database code here
      }
    }, 2*60*1000, 2*60*1000);
    
    // Since Java-8
    timer.scheduleAtFixedRate(() -> /* your database code here */, 2*60*1000, 2*60*1000);
    

    Making a task timeout

    To specifically do what the clarified question asks, that is attempting to perform a task for a given period of time, you could do the following:

    ExecutorService service = Executors.newSingleThreadExecutor();
    
    try {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                // Database task
            }
        };
    
        Future<?> f = service.submit(r);
    
        f.get(2, TimeUnit.MINUTES);     // attempt the task for two minutes
    }
    catch (final InterruptedException e) {
        // The thread was interrupted during sleep, wait or join
    }
    catch (final TimeoutException e) {
        // Took too long!
    }
    catch (final ExecutionException e) {
        // An exception from within the Runnable task
    }
    finally {
        service.shutdown();
    }
    

    This will execute normally with exceptions if the task completes within 2 minutes. If it runs longer than that, the TimeoutException will be throw.

    One issue is that although you'll get a TimeoutException after the two minutes, the task will actually continue to run, although presumably a database or network connection will eventually time out and throw an exception in the thread. But be aware it could consume resources until that happens.