Wie kann man einen Timer einstellen, beispielsweise für 2 Minuten, um zu versuchen, eine Verbindung zu einer Datenbank herzustellen, und dann eine Ausnahme auslösen, wenn ein Verbindungsproblem vorliegt?
Wie kann man einen Timer einstellen, beispielsweise für 2 Minuten, um zu versuchen, eine Verbindung zu einer Datenbank herzustellen, und dann eine Ausnahme auslösen, wenn ein Verbindungsproblem vorliegt?
Antworten:
Der erste Teil der Antwort ist also, wie man das macht, was das Thema verlangt, da ich es anfangs so interpretiert habe und einige Leute es als hilfreich empfanden. Die Frage wurde inzwischen geklärt und ich habe die Antwort erweitert, um dies zu beheben.
Timer einstellen
Zuerst müssen Sie einen Timer erstellen (ich verwende die java.util
Version hier):
import java.util.Timer;
..
Timer timer = new Timer();
So führen Sie die Aufgabe aus, sobald Sie Folgendes tun würden:
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);
So wiederholen Sie die Aufgabe nach der Dauer, die Sie ausführen würden:
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);
Zeitüberschreitung für Aufgaben
Um genau das zu tun, was in der geklärten Frage gestellt wird, dh zu versuchen, eine Aufgabe für einen bestimmten Zeitraum auszuführen, können Sie Folgendes tun:
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();
}
Dies wird mit Ausnahmen normal ausgeführt, wenn die Aufgabe innerhalb von 2 Minuten abgeschlossen ist. Wenn es länger läuft, wird die TimeoutException ausgelöst.
Ein Problem ist, dass die Task zwar nach zwei Minuten eine TimeoutException erhält, die Task jedoch weiterhin ausgeführt wird , obwohl vermutlich eine Datenbank- oder Netzwerkverbindung irgendwann eine Zeitüberschreitung aufweist und eine Ausnahme in den Thread auslöst. Beachten Sie jedoch, dass dies bis dahin Ressourcen verbrauchen kann.
Benutze das
long startTime = System.currentTimeMillis();
long elapsedTime = 0L.
while (elapsedTime < 2*60*1000) {
//perform db poll/check
elapsedTime = (new Date()).getTime() - startTime;
}
//Throw your exception
Ok, ich glaube ich verstehe dein Problem jetzt. Sie können eine Zukunft verwenden, um zu versuchen, etwas zu tun, und dann nach einer Weile eine Zeitüberschreitung, wenn nichts passiert ist.
Z.B:
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
}
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);
[Android] wenn jemand Timer mit Java auf Android implementieren möchte .
Sie müssen einen solchen UI-Thread verwenden , um Vorgänge auszuführen.
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
ActivityName.this.runOnUiThread(new Runnable(){
@Override
public void run() {
// do something
}
});
}
}, 2000));