Comment définir une minuterie en Java?


Comment définir une minuterie, disons pendant 2 minutes, pour essayer de se connecter à une base de données, puis lever une exception en cas de problème de connexion?

Author: bravehart_sf, 2010-10-28

5 answers

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 que quelques personnes ont semblé trouver utile. La question a depuis été clarifiée et j'ai étendu la réponse pour y répondre.

Réglage d'une minuterie

Vous devez d'abord créer une minuterie (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 utilisez:

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 ferait:

timer.scheduleAtFixedRate(new TimerTask() {
  @Override
  public void run() {
    // Your database code here
  }
}, 2*60*1000, 2*60*1000);

Faire un délai d'expiration de tâche

Pour faire spécifiquement ce que la question clarifiée demande, c'est-à-dire tenter d'effectuer une tâche pendant une période de temps donnée, vous pouvez 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. S'il s'exécute plus longtemps que cela, l'exception TimeoutException sera lancée.

Un problème est que bien que vous obteniez une TimeoutException après les deux minutes, la tâche en fait, continuez à exécuter , bien que vraisemblablement une connexion de base de données ou de réseau finira par expirer et lèvera une exception dans le thread. Mais sachez qu'il pourrait consommer des ressources jusqu'à ce que cela se produise.

 240
Author: andrewmu, 2013-10-31 15:44:35

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
 22
Author: nimWM, 2012-07-17 15:35:02

Ok, je pense que je comprends votre problème maintenant. Vous pouvez utiliser un futur pour essayer de faire quelque chose, puis timeout après un peu 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
}
 8
Author: andrewmu, 2012-03-29 14:20:38

Comment arrêter la minuterie? Arrêter et jouer à nouveau quand faire 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 l'ouvrez à 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)
 7
Author: Mohamed Hassan Zidan, 2015-03-10 22:47:06
    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); 
 1
Author: Mahadev Mane, 2017-05-06 13:13:40