Bonjour,
Après avoir arrêter la tâche effectuée par un TimerTask par sa méthode wait, est-ce possible de la redémarrer après un certain délai ? Si oui, comment ?
Merci de votre aide.
Version imprimable
Bonjour,
Après avoir arrêter la tâche effectuée par un TimerTask par sa méthode wait, est-ce possible de la redémarrer après un certain délai ? Si oui, comment ?
Merci de votre aide.
Salut,
On ne peut pas relancer une TimerTask qui a été arrêtée (par appel de cancel()). Mais on peut faciler contourner le problème.
Au lieu d'implémenter TimerTask, on peut implémenter directement Runnable, ce qui ne change pas grand chose dans l'implémentation d'une tâche.
Du coup, on peut faire :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 public class RunnableTimerTask extends TimerTask { private final Runnable runnable; public RunnableTimerTask(Runnable runnable) { this.runnable=Objects.requireNonNull(runnable); } @Override public void run() { runnable.run(); } }
Il y a la solution aussi de passer plutôt par un ExecutorService, qui travaille déjà directement avec des Runnable (ou des Callable si on veut récupérer un résultat en retour).Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 Timer timer = new Timer(); Runnable runnable = ()-> System.out.println("Task is running"); System.out.println("start task"); TimerTask timertask = new RunnableTimerTask(runnable); timer.schedule(timertask , 1000, 1000); Thread.sleep(3000); System.out.println("cancel task"); timertask.cancel(); Thread.sleep(3000); System.out.println("restart task"); timertask = new RunnableTimerTask(runnable); timer.schedule(timertask, 1000, 1000); Thread.sleep(3000); System.out.println("shutdown"); timer.cancel();
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 //ScheduledExecutorService executorService = Executors.newScheduledThreadPool(5); ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); Runnable runnable = ()-> System.out.println("Task is running"); System.out.println("start task"); Future<?> future = executorService.scheduleAtFixedRate(runnable, 1, 1, TimeUnit.SECONDS); Thread.sleep(3000); System.out.println("cancel task"); future.cancel(true); Thread.sleep(3000); System.out.println("restart task"); future = executorService.scheduleAtFixedRate(runnable, 1, 1, TimeUnit.SECONDS); future.cancel(true); Thread.sleep(3000); System.out.println("shutdown"); executorService.shutdown();
Merci pour la clarté des explications, j'étudie tout ça...
Bonne journée