2012-02-14 18 views

Odpowiedz

30

Aby to zrobić, należy wykonać submit() zadanie zamiast ExecutorService zamiast wywoływać execute(). Po wykonaniu tej czynności zwracany jest kod Future, który można wykorzystać do manipulowania zaplanowanym zadaniem. W szczególności można wywołać cancel(true) na powiązanym Future, aby przerwać aktualnie wykonywane zadanie (lub całkowicie pomiń wykonanie, jeśli zadanie nie zostało jeszcze uruchomione).

Nawiasem mówiąc, obiekt zwrócony przez Executors.newSingleThreadExecutor() jest w rzeczywistości ExecutorService.

+2

Aby to zadziałało, nie musisz ręcznie sprawdzać, czy wątek jest przerywany. Nie wszystkie wątki można przerwać. - Myślę, że tak. –

+2

Tak, opisuje to przerwanie wątku z uruchomionym zadaniem. To, czy zadanie odpowiada na przerwanie, czy nie, jest zupełnie inne. To zależy od tego, co robi zadanie. – erickson

+0

@erickson Mam również podobne pytanie [tutaj] (http://stackoverflow.com/questions/29159184/how-can-i-interrupt-resttemplate-call-as-soon-as-my-thread-is-interrupted) związane z przerwaniem wątku. Jeśli to możliwe, możesz mi pomóc. Nie otrzymałem jeszcze żadnej odpowiedzi, więc wszelka pomoc zostanie bardzo doceniona. – john

4

Innym sposobem przerwania wewnętrznego wątku zarządzanego przez executor jest wywołanie metody shutdownNow(..) na twoim ExecutorService. Zauważ jednak, że w przeciwieństwie do rozwiązania @ erickson, spowoduje to, że cały ThreadPoolExecutor stanie się niezdatny do dalszego użytku.

znajdę to podejście szczególnie przydatna w przypadkach, gdy ExecutorService nie jest już potrzebna i oku na Future przypadkach nie jest konieczne (a najlepszym przykładem jest metoda aplikacji exit(..)).

odpowiednich informacji od ExecutorService#shutdownNow(..) Javadocs:

próbują zatrzymać wszystkie zadania aktywnie wykonującego zatrzymuje przetwarzanie zadań oczekujących, i zwraca listę zadań, które oczekują wykonanie.

Nie ma żadnych gwarancji, oprócz prób najlepszego wysiłku, aby zatrzymać przetwarzanie aktywnie wykonujących zadania. Na przykład typowe implementacje zostaną anulowane za pomocą Thread.interrupt, więc każde zadanie, które nie odpowiada na przerwania , może nigdy nie zostać przerwane.