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