Podczas korzystania z ExecutorService
zwróconego przez Executors.newSingleThreadExecutor()
, w jaki sposób mogę go przerwać?Jak przerwać wątki ExecutorService?
Odpowiedz
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
.
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.
- 1. Jak przerwać wątki utworzone za pomocą ThreadPool.QueueUserWorkItem
- 2. Wątki Java: opóźnienie ExecutorService między wątkami
- 3. W jaki sposób ograniczasz wątki w ExecutorService?
- 4. Jak przerwać, wstrzymać i wznowić wątki w C#?
- 5. Android: AsyncTask LUB normalne wątki Java z ExecutorService
- 6. Jak zamknąć ExecutorService?
- 7. Java: konieczna jest synchronizacja usługi ExecutorService?
- 8. Java ExecutorService wstrzymuje/wznawia określony wątek
- 9. Jak przerwać std :: thread?
- 10. Jak przerwać żądanie pobrania?
- 11. Jak przerwać wykonywanie selektora?
- 12. Jak przerwać Git Bisect
- 13. jak przerwać obsługę KVM
- 14. Jak przerwać obliczenia asynchroniczne w Scali?
- 15. Wyłączanie się ExecutorService
- 16. Executorservice i Runnable
- 17. Java ExecutorService and ThreadPoolExecutor
- 18. Wątki w Java i Python
- 19. Jak zatrzymać zgłoszenie przesłane do ExecutorService?
- 20. Przerwać wątek?
- 21. Zatrzymaj Runnable przesłane do ExecutorService
- 22. przerwać listowych
- 23. Czy można przerwać BufferedReader.readLine() z Future.cancel (true)?
- 24. Jak zatrzymać/przerwać boost :: thread?
- 25. Jak przerwać raport Crystal Report:
- 26. Jak przerwać wywoływanie funkcji PowerShell
- 27. Solaris GDB: jak przerwać wykonywanie?
- 28. Jak mogę "przerwać" budowę gulpa
- 29. Jak przerwać sesję w Magento?
- 30. Jak przerwać słuchanie kanału socket.io?
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. –
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
@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