Portál AbcLinuxu, 12. května 2025 06:43

Dotaz: Java Timer - přerušení a znovuspuštění tasku

dandyg avatar 2.11.2009 17:18 dandyg | blog: dandyg
Java Timer - přerušení a znovuspuštění tasku
Přečteno: 1381×
Odpovědět | Admin
Můj problém:

Mám aplikaci ve Swingu, kde je několik samostatných panelů, do kterých periodicky dodávám data. Data dodávám pomocí observable-observer, což skvěle funguje. Zatím periodické provádění zajišťuji pomocí 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:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

3.11.2009 07:39 moira | skóre: 30 | blog: nesmysly
Rozbalit Rozbalit vše Re: Java Timer - přerušení a znovuspuštění tasku
Odpovědět | | Sbalit | Link | Blokovat | Admin
Neměl by se spíše cancellnout TimerTask?
Překladač ti nikdy neřekne: "budeme kamarádi"
3.11.2009 12:02 msaft | skóre: 7
Rozbalit Rozbalit vše Re: Java Timer - přerušení a znovuspuštění tasku
Odpovědět | | Sbalit | Link | Blokovat | Admin
od boku: ScheduledThreadPoolExecutor(1) a setCorePoolSize(0) pro preruseni?
Řešení 1× (dandyg (tazatel))
3.11.2009 20:13 razor | skóre: 33
Rozbalit Rozbalit vše Re: Java Timer - přerušení a znovuspuštění tasku
Odpovědět | | Sbalit | Link | Blokovat | Admin
Na to zastavení a opětovné spuštění můžeš zkusit použít místo cancel nějakou proměnnou (atomickou) nebo nějaký zámek. Např.

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


dandyg avatar 3.11.2009 22:45 dandyg | blog: dandyg
Rozbalit Rozbalit vše Re: Java Timer - přerušení a znovuspuštění tasku
To je přesně to, co jsem potřeboval. Díky moc!

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.