Czasami powtarzane zadanie jest dłuższe niż jego okres (w moim przypadku może to się zdarzyć przez wiele godzin) . Pomyśl o powtarzającym się zadaniu, które trwa 7 minut i planowane jest uruchamianie co 10 minut, ale czasami trwa to 15 minut na każdy bieg przez kilka godzin z rzędu.Zaplanuj powtórzenie jednowątkowe powtarzalne w java, ale pomiń bieżący przebieg, jeśli poprzedni przebieg nie został zakończony.
Klasy Timer i ScheduledThreadPoolExecutor mają metodę scheduleAtFixedRate, która jest zwykle używana w tego typu funkcjach. Jednak obie mają tę cechę, że "starają się nadrobić zaległości, gdy za nimi się znajdują". Innymi słowy, jeśli czasomierz jest opóźniony o kilka egzekucji, buduje kolejkę pracy, która będzie pracowała nieprzerwanie, dopóki nie zwróci się do liczby serii, które miałyby miejsce, gdyby żadne z zadań nie zajęło więcej czasu określony czas. Chcę uniknąć tego zachowania, pomijając bieżące wykonanie, jeśli poprzednie uruchomienie nie zostało zakończone.
Mam jedno rozwiązanie, które wymaga rozmyślania za pomocą metody AfterExution z puli executorów, ponownego obliczania opóźnienia i zmiany harmonogramu działania z nowym opóźnieniem, ale zastanawiałem się, czy istnieje prostszy sposób, lub czy ta funkcja już istnieje w wspólna biblioteka gdzieś. Wiem o planowaniu z ustalonym opóźnieniem, a nie ustalonym okresem, ale to nie zadziała, ponieważ ważne jest, aby spróbować wykonać zadania w ustalonym czasie. Czy są jakieś prostsze opcje niż moje rozwiązanie AfterExecution?
Najprostszym zadaniem jest sprawdzenie, czy jest już uruchomiona inna instancja, a jeśli tak, natychmiast zrób to sam. –
@Hot Licks: ScheduledExecutorService nie uruchamia ich jednak równolegle. –
Więc jaki jest tutaj podstawowy wymóg? Że to tylko i zawsze zaczyna się ** na ** 10-minutowym odstępie, niezależnie od tego, czy brakowało jednego? Jeśli tak, to nie mówisz o kursie. –