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?
15 Answers
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.
11Use this
long startTime = System.currentTimeMillis(); long elapsedTime = 0L. while (elapsedTime < 2*60*1000) { //perform db poll/check elapsedTime = (new Date()).getTime() - startTime; } //Throw your exception 11Ok, I think I understand your problem now. You can use a Future to try to do something and then timeout after a bit if nothing has happened.
E.g.:
FutureTask<Void> task = new FutureTask<Void>(new Callable<Void>() { @Override public Void call() throws Exception { // Do DB stuff return null; } }); Executor executor = Executors.newSingleThreadScheduledExecutor(); executor.execute(task); try { task.get(5, TimeUnit.SECONDS); } catch(Exception ex) { // Handle your exception } 3 new java.util.Timer().schedule(new TimerTask(){ @Override public void run() { System.out.println("Executed..."); //your code here //1000*5=5000 mlsec. i.e. 5 seconds. u can change accordngly } },1000*5,1000*5); 2[Android] if someone looking to implement timer on android using java.
you need use UI thread like this to perform operations.
Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { ActivityName.this.runOnUiThread(new Runnable(){ @Override public void run() { // do something } }); } }, 2000));