Portál AbcLinuxu, 12. května 2025 06:43
java.util.Timer
a java.util.TimerTask
.
V konstruktoru "aplikační" třídy odděděné od TimerTask
vytvářím novou instanci Timer
a následně provedu schedule(this,0,delay);
neboli spouštím periodické opakování metody run
z té samé třídy. To také funguje jak má. Nyní bych ale chtěl periodické provádění přerušit a později opět spustit.
Pokud ale provedu timer.cancel();
a později se znovu pokusím úlohu naplánovat, logicky a zcela očekávaně to skončí IllegalStateException
, přesně podle javadoc. Zkusil jsem tedy před opětovným naplánováním vytvořit novou instanci Timer
a naplánovat již nad novým timerem, ale problém stále trvá.
Nemá někdo s tímto zkušenosti. Popřípadě ocením i jiné možnosti opakování úlohy s možným přerušením a znovuspuštěním.
Řešení dotazu:
try { final Lock locker = new ReentrantLock(); final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); final Runnable beeper = new Runnable() { public void run() { locker.lock(); System.out.println("some job"); locker.unlock(); } }; final ScheduledFuture> jobHandler = scheduler.scheduleWithFixedDelay(beeper, 1, 5, TimeUnit.SECONDS); TimeUnit.SECONDS.sleep(6); System.out.println("zastavujem"); locker.lock(); TimeUnit.SECONDS.sleep(12); System.out.println("poustime"); locker.unlock(); TimeUnit.SECONDS.sleep(12); System.out.println("koncime"); jobHandler.cancel(false); scheduler.shutdown(); } catch (InterruptedException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); }
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.