Harmonogram Zadań W Javie
W praktyce programistycznej często zdarza się, że potrzebujemy uruchomić jakieś zadanie w ściśle określonym czasie, bądź co pewien interwał czasu. W JEE z pomocą przychodzi usługa timera (najczęściej w postaci adnotacji @Schedule). Podobne mechanizmy spotkamy także w JSE. Java Concurrency API posiada prosty, wielowątkowy mechanizm, który pozwala nam na uruchamianie zadań co pewien określony przedział czasu. Poznajmy ScheduledExecutorService.
ScheduledExecutorService jest interfejsem dziedziczącym po ExecutorService. Warto przyjrzeć się jego 4 najważniejszym metodom:
|
|
- tworzy i wykonuje zadanie Callable po podanym opóźnieniu
|
|
- przeciążona wersja poprzedniej metody, przyjmująca zadanie Runnable
|
|
- tworzy i wykonuje zadanie Runnable po podanym wstępnym opóźnieniu (initialDelay), po czym przekazuje to zadanie do wykonania co zadany odcinek czasu (delay), niezależnie od tego, czy poprzednie zadanie zostało wykonane
|
|
- metoda analogiczna do poprzedniej, z tą różnicą, że czeka na wykonanie poprzedniego zadania, po jego wykonaniu czeka zadany odcinek czasu (delay), zanim przekaże to zadanie ponownie do wykonania
Aby zakończyć pracę dyspozytora możemy użyć metody shutdown() na obiekcie klasy ScheduledExecutorService bądź anulować wykonywanie zadań za pomocą metody cancel(…) obiektu klasy Future (a ściślej ScheduledFuture), zwracanego przed powyższe metody. W drugim przypadku samo anulowanie nie jest wystarczające - jeżeli nie zamkniemy ostatecznie ExecutorService za pomocą metody shutdown(), wątek będzie nadal pracował w tle, co spowoduje, że JVM nie zakończy działania!
Poniżej zamieszczam prosty przykładowy program, który generuje napis co 5 sekund, ze wstępnym 10-sekundowym opóźnieniem, który przerywa pracę po 60 sekundach. Dodatkowo, aby JVM zakończyła działanie, zostało dodane odpowiednie zadanie, wykonywane po 70 sekundach.
|
|
Warto zwrócić uwagę, że zadania są wykonywane w jednym wątku (Executors.newScheduledThreadPool(1)). Oczywiście mając więcej, bardziej złożonych zadań, należy zastanowić się nad zwiększeniem liczby dostępnych wątków.