Comment définir un minuteur, par exemple pendant 2 minutes, pour essayer de se connecter à une base de données, puis émettre une exception en cas de problème?
La première partie de la réponse est donc de savoir comment faire ce que le sujet demande, car c’est ainsi que j’ai interprété le texte initialement et que quelques personnes semblaient utiles. La question a été clarifiée depuis et j'ai étendu la réponse à cette question.
Réglage d'une minuterie
Vous devez d’abord créer un minuteur (j’utilise la version Java.util
ici):
import Java.util.Timer;
..
Timer timer = new Timer();
Pour exécuter la tâche une fois que vous 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 souhaitée:
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 un timeout de tâche
Pour effectuer spécifiquement ce que la question clarifiée demande, 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. S'il dure plus longtemps que cela, TimeoutException sera levé.
Un problème est que bien que vous obteniez une exception TimeoutException après les deux minutes, , la tâche continuera à s'exécuter , bien qu'une connexion à une base de données ou à un réseau finalement expirer et jeter une exception dans le fil. 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 avenir pour essayer de faire quelque chose, puis expirer après 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
}
Comment arrêter le chronomètre? Arrêtez-vous et rejouez quand vous faites quelque chose dans ce code
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
// Your database code here
}
}, 2*60*1000, 2*60*1000);
Quand j'utilise le timer.cancel();
il s’arrêtera mais si vous fermez le formulaire et ouvrez-le à nouveau, une exception est levée
Exception in thread "AWT-EventQueue-0" Java.lang.IllegalStateException: Timer already cancelled.
at Java.util.Timer.sched(Timer.Java:354)
at Java.util.Timer.scheduleAtFixedRate(Timer.Java:296)
at View.Electronic_Meeting.this_componentShown(Electronic_Meeting.Java:295)
at View.Electronic_Meeting.access$000(Electronic_Meeting.Java:36)
at View.Electronic_Meeting$1.componentShown(Electronic_Meeting.Java:85)
at Java.awt.AWTEventMulticaster.componentShown(AWTEventMulticaster.Java:162)
at Java.awt.Component.processComponentEvent(Component.Java:6095)
at Java.awt.Component.processEvent(Component.Java:6043)
at Java.awt.Container.processEvent(Container.Java:2041)
at Java.awt.Component.dispatchEventImpl(Component.Java:4630)
at Java.awt.Container.dispatchEventImpl(Container.Java:2099)
at Java.awt.Component.dispatchEvent(Component.Java:4460)
at Java.awt.EventQueue.dispatchEvent(EventQueue.Java:599)
at Java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.Java:269)
at Java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.Java:184)
at Java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.Java:174)
at Java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.Java:169)
at Java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.Java:161)
at Java.awt.EventDispatchThread.run(EventDispatchThread.Java:122)
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 timer sur Android en utilisant Java.
vous devez utiliser thread UI comme ceci 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));