La première partie de la réponse porte sur la façon de faire ce que le sujet demande, car c'est ainsi que je l'ai initialement interprétée et que quelques personnes ont semblé la trouver utile. La question a été clarifiée depuis et j'ai étendu la réponse pour y répondre.
Réglage d'une minuterie
Tout d'abord, vous devez créer un Timer (j'utilise la fonction java.util
version ici) :
import java.util.Timer;
..
Timer timer = new Timer();
Pour exécuter la tâche une fois, vous devez faire ce qui suit
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 en sorte que le délai d'une tâche soit dépassé
Pour faire spécifiquement ce que la question clarifiée demande, c'est-à-dire tenter d'effectuer une tâche pendant une période donnée, vous pourriez faire ce qui 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, l'exception TimeoutException sera lancée.
Un problème est que même si vous obtenez une TimeoutException après les deux minutes, la tâche continuera réellement à s'exécuter Il est probable qu'une connexion à une base de données ou à un réseau finira par s'interrompre et déclencher une exception dans le fil de discussion. Mais sachez que cela peut consommer des ressources jusqu'à ce que cela se produise.
1 votes
L'OP pourrait-il préciser s'il souhaite simplement tenter l'action pendant au moins 2 minutes, ou si l'exception doit être levée après les deux minutes, même si une tentative de connexion est en cours ?