2016-03-14 12 views
8

ScheduledExecutorService dziedziczy dwie metody: od ExecutorService, shutdown() i shutdownNow(). Różnica między nimi:Mieszanina zamknięcia() i zamknięciaNow()

shutdown inicjuje uporządkowane zamknięcie, w którym wykonywane są wcześniej przesłane zadania, ale żadne nowe zadania nie zostaną zaakceptowane. Inwokacja nie ma dodatkowego efektu, jeśli została już zamknięta.

shutdownNow próbuje zatrzymać wszystkie aktywnie wykonujące zadania, zatrzymuje przetwarzanie oczekujących zadań i zwraca listę zadań, które czekały na wykonanie.

Teraz chcę zatrzymać przetwarzanie oczekujących zadań, podczas gdy ja nie chcę przerywać aktualnie wykonywanych zadań. Nie mogę przerwać wątków, ponieważ biorą w tym udział biblioteki osób trzecich i nie radzą sobie dobrze z przerwaniami :-(Ale muszę anulować zadania, które nie są obecnie wykonywane, ponieważ większość z nich jest zaplanowana w godzinę.

Jaki jest najlepszy sposób na radzenie sobie z tym co mam opcje

+0

Kombinacja 'shutdown' i [' awaitTermination'] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html#awaitTermination-long-java. util.concurrent.TimeUnit-) musi załatwić sprawę. – marcospereira

+0

@marcospereira 'awaitTermination' będzie czekał aż ostatnie zaplanowane zadanie zostanie zakończone. – steffen

Odpowiedz

4

Brzmi jak wywołanie setExecuteExistingDelayedTasksAfterShutdownPolicy(false) na egzekutora powinno wystarczyć:?

Ustawia politykę dotyczącą tego, czy wykonać istniejące opóźnione zadania, nawet gdy ten executor został zamknięty. W takim przypadku te zadania będą kończy się po wyłączeniu Teraz lub po ustawieniu zasady na wartość false, gdy jest już wyłączone. Ta wartość jest domyślnie prawdziwa.

Ponieważ domyślnie jest to true, zadania te są wykonywane. Jeśli ustawisz tę wartość na false, nie będą one już wykonywane. Nie należy tego mylić z zadaniami , które dotyczą dokumentów, które cytujesz. Po prostu czekają w kolejce, aby od razu wykonać egzekucję, gdy jest wolny pracownik.

+0

To jest jedna chwytliwa metoda ... –

+0

Tak, to działa świetnie! Zapomniałem tej metody, ponieważ należy ona do 'ScheduledThreadPoolExecutor' i' Executors.newScheduledThreadPool (int) 'zwraca interfejs' ScheduledExecutorService'. Teraz sam tworzę STPE. Dzięki! – steffen