Hoe stel ik een timer in Java in?

Hoe stel je een timer in, bijvoorbeeld 2 minuten, om te proberen verbinding te maken met een database en vervolgens een uitzondering te genereren als er een probleem is met de verbinding?


Antwoord 1, autoriteit 100%

Dus het eerste deel van het antwoord is hoe je moet doen wat het onderwerp vraagt, want dit was hoe ik het aanvankelijk interpreteerde en een paar mensen leken behulpzaam te zijn. De vraag is sindsdien verduidelijkt en ik heb het antwoord uitgebreid om dat aan te pakken.

Een timer instellen

Eerst moet je een timer maken (ik gebruik hier de java.util-versie):

import java.util.Timer;

..

Timer timer = new Timer();

Om de taak één keer uit te voeren, zou u het volgende doen:

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);

Om de taak te laten herhalen na de duur die u zou doen:

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);

Een taaktime-out maken

Om specifiek te doen wat de verduidelijkte vraag vraagt, namelijk een taak proberen uit te voeren voor een bepaalde periode, kun je het volgende doen:

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();
}

Dit wordt normaal uitgevoerd met uitzonderingen als de taak binnen 2 minuten is voltooid. Als het langer duurt, wordt de TimeoutException gegooid.

Een probleem is dat, hoewel u na twee minuten een TimeoutException krijgt, de taak daadwerkelijk wordt uitgevoerd, hoewel vermoedelijk een database- of netwerkverbinding uiteindelijk een time-out zal krijgen en een uitzondering zal veroorzaken de draad. Maar houd er rekening mee dat het middelen kan verbruiken totdat dat gebeurt.


Antwoord 2, autoriteit 9%

Gebruik dit

long startTime = System.currentTimeMillis();
long elapsedTime = 0L.
while (elapsedTime < 2*60*1000) {
    //perform db poll/check
    elapsedTime = (new Date()).getTime() - startTime;
}
//Throw your exception

Antwoord 3, autoriteit 4%

Ok, ik denk dat ik je probleem nu begrijp. Je kunt een toekomst gebruiken om te proberen iets te doen en na een tijdje een time-out hebben als er niets is gebeurd.

Bijvoorbeeld:

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
}

Antwoord 4

   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); 

Antwoord 5

[Android] Als iemand op zoek is naar timer op Android met behulp van Java .

U hebt UI-draad zoals deze nodig om operaties uit te voeren.

Timer timer = new Timer();
timer.schedule(new TimerTask() {
           @Override
            public void run() {
                ActivityName.this.runOnUiThread(new Runnable(){
                    @Override
                      public void run() {
                       // do something
                      }        
                });
            }
        }, 2000));

Other episodes