Come impostare un timer, ad esempio per 2 minuti, per provare a connettersi a un database, quindi generare un'eccezione in caso di problemi nella connessione?
Come impostare un timer, ad esempio per 2 minuti, per provare a connettersi a un database, quindi generare un'eccezione in caso di problemi nella connessione?
Risposte:
Quindi la prima parte della risposta è come fare ciò che il soggetto chiede in quanto questo è stato il modo in cui inizialmente l'ho interpretato e alcune persone sembravano trovare utili. Da allora la domanda è stata chiarita e ho esteso la risposta per risolverlo.
Impostazione di un timer
Per prima cosa devi creare un timer (sto usando la java.util
versione qui):
import java.util.Timer;
..
Timer timer = new Timer();
Per eseguire l'attività una volta che si dovrebbe fare:
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);
Per ripetere l'operazione dopo la durata, è necessario:
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);
Effettuare un timeout dell'attività
Per fare specificamente ciò che viene posta la domanda chiarita, ovvero il tentativo di eseguire un'attività per un determinato periodo di tempo, è possibile effettuare le seguenti operazioni:
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();
}
Ciò verrà eseguito normalmente con eccezioni se l'attività viene completata entro 2 minuti. Se dura più a lungo, verrà lanciata TimeoutException.
Un problema è che sebbene dopo due minuti otterrai TimeoutException, l'attività continuerà effettivamente a essere eseguita , sebbene presumibilmente un database o una connessione di rete finiranno per scadere e generare un'eccezione nel thread. Ma attenzione, potrebbe consumare risorse fino a quando ciò non accadrà.
Usa questo
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, penso di aver capito il tuo problema ora. Puoi usare un Futuro per provare a fare qualcosa e poi andare in timeout dopo un po 'se non è successo nulla.
Per esempio:
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] se qualcuno sta cercando di implementare il timer su Android usando Java .
è necessario utilizzare il thread dell'interfaccia utente in questo modo per eseguire operazioni.
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
ActivityName.this.runOnUiThread(new Runnable(){
@Override
public void run() {
// do something
}
});
}
}, 2000));