web-dev-qa-db-fra.com

Comment définir une minuterie en Java?

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?

138
Ankita

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.

263
andrewmu

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
23
nimWM

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
}
10
andrewmu

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)
7
    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); 
2
Mahadev Mane

[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));
1
Abhishek Garg