Comment définir une minuterie, par exemple pendant 2 minutes, pour essayer de se connecter à une base de données, puis lever une exception en cas de problème de connexion?
Comment définir une minuterie, par exemple pendant 2 minutes, pour essayer de se connecter à une base de données, puis lever une exception en cas de problème de connexion?
Réponses:
Donc, la première partie de la réponse est de savoir comment faire ce que le sujet demande, car c'est ainsi que je l'ai initialement interprété et quelques personnes ont semblé trouver utile. La question a été clarifiée depuis et j'ai élargi la réponse pour y répondre.
Réglage d'une minuterie
Vous devez d'abord créer un minuteur (j'utilise la java.util
version ici):
import java.util.Timer;
..
Timer timer = new Timer();
Pour exécuter la tâche une fois que vous le feriez:
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);
Pour que la tâche se répète après la durée que vous feriez:
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);
Faire une tâche timeout
Pour faire spécifiquement ce que demande la question clarifiée, c'est-à-dire tenter d'exécuter une tâche pendant une période donnée, vous pouvez procéder comme suit:
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();
}
Cela s'exécutera normalement avec des exceptions si la tâche se termine dans les 2 minutes. Si elle s'exécute plus longtemps que cela, TimeoutException sera levée.
Un problème est que bien que vous obteniez une TimeoutException après les deux minutes, la tâche continuera en fait à s'exécuter , bien que vraisemblablement une base de données ou une connexion réseau finira par expirer et lèvera une exception dans le thread. Mais sachez que cela pourrait consommer des ressources jusqu'à ce que cela se produise.
Utilisez ceci
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, je pense que je comprends votre problème maintenant. Vous pouvez utiliser un Future pour essayer de faire quelque chose, puis expirer au bout d'un moment si rien ne s'est passé.
Par exemple:
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] si quelqu'un cherche à implémenter un minuteur sur Android en utilisant java .
vous devez utiliser un fil d'interface utilisateur comme celui-ci pour effectuer des opérations.
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
ActivityName.this.runOnUiThread(new Runnable(){
@Override
public void run() {
// do something
}
});
}
}, 2000));