Comment définir une timer en Java?

Comment définir une timer, disons pendant 2 minutes, pour essayer de se connecter à une firebase database, puis lancer une exception s’il y a un problème de connexion?

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 d’abord interprété et que quelques personnes ont semblé trouver utile. La question a depuis été clarifiée et j’ai étendu la réponse à cela.

Réglage d’une timer

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); 

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); 

Faire un timeout de tâche

Pour faire précisément ce que la question clarifiée demande, c’est-à-dire tenter d’effectuer une tâche pour une période donnée, vous pouvez effectuer les opérations suivantes:

 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 est plus long que cela, le TimeoutException sera lancé.

Un problème est que, même si vous obtenez une exception TimeoutException après les deux minutes, la tâche continuera à s’exécuter , même si une connexion de firebase database ou de réseau finira par expirer et lancera une exception dans le thread. Mais sachez que cela pourrait consumr 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 un peu si rien ne s’est passé.

Par exemple:

 FutureTask task = new FutureTask(new Callable() { @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 minuteur? Arrêtez et jouez à nouveau lorsque 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); 

Lorsque j’utilise le timer.cancel();

il va s’arrêter mais si fermer le formulaire et l’ouvrir à nouveau, l’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. ie 5 seconds. u can change accordngly } },1000*5,1000*5);