Ilekroć dzwonię pod numer shutdownNow()
lub shutdown()
, nie wyłącza się. Czytałem o kilku wątkach, w których mówiło się, że wyłączanie nie jest gwarantowane - czy ktoś może mi zapewnić dobry sposób robienia tego?Jak zamknąć ExecutorService?
Odpowiedz
Typowy wzór jest:
executorService.shutdownNow();
executorService.awaitTermination();
Dzwoniąc shutdownNow
, wykonawca będzie (ogólnie) starają się przerwać nici, którymi zarządza. Aby zamknięcie było pełne wdzięku, musisz przechwycić przerwany wyjątek w wątkach lub sprawdzić stan przerwania. Jeśli nie, twoje wątki będą działać wiecznie, a twój executor nigdy nie będzie w stanie się zamknąć. Dzieje się tak dlatego, że przerwanie wątków w Javie jest procesem opartym na współpracy (tzn. Kod przerywany musi coś zrobić, gdy zostanie poproszony o zatrzymanie, a nie kod przerywający kod).
Na przykład poniższy kod drukuje Exiting normally...
. Ale jeśli skomentujesz linię if (Thread.currentThread().isInterrupted()) break;
, wydrukuje ona Still waiting...
, ponieważ wątki w executorze nadal działają.
public static void main(String args[]) throws InterruptedException {
ExecutorService executor = Executors.newFixedThreadPool(1);
executor.submit(new Runnable() {
@Override
public void run() {
while (true) {
if (Thread.currentThread().isInterrupted()) break;
}
}
});
executor.shutdownNow();
if (!executor.awaitTermination(100, TimeUnit.MICROSECONDS)) {
System.out.println("Still waiting...");
System.exit(0);
}
System.out.println("Exiting normally...");
}
Alternatywnie, może to być napisane z InterruptedException
tak:
public static void main(String args[]) throws InterruptedException {
ExecutorService executor = Executors.newFixedThreadPool(1);
executor.submit(new Runnable() {
@Override
public void run() {
try {
while (true) {Thread.sleep(10);}
} catch (InterruptedException e) {
//ok let's get out of here
}
}
});
executor.shutdownNow();
if (!executor.awaitTermination(100, TimeUnit.MICROSECONDS)) {
System.out.println("Still waiting...");
System.exit(0);
}
System.out.println("Exiting normally...");
}
wiesz, jeśli zamknięcie inicjuje również 'Thread.interrupt()', z Java API nie robi wydaje się, że 'shutdown' przerywa wątki? – Bionix1441
@ Bionix1441 Nie, nie ma. 'shutdownNow' działa jednak. – assylias
Najlepszym sposobem jest to, co faktycznie mają w javadoc, która jest:
Poniższe zamykają metoda w dół ExecutorService w dwóch fazach, najpierw przez wywołanie
shutdown
, aby odrzucić przychodzące zadania, a następnie wywołanieshutdownNow
, jeśli to konieczne, aby anulować jakiekolwiek długotrwałe zadania:
void shutdownAndAwaitTermination(ExecutorService pool) {
pool.shutdown(); // Disable new tasks from being submitted
try {
// Wait a while for existing tasks to terminate
if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
pool.shutdownNow(); // Cancel currently executing tasks
// Wait a while for tasks to respond to being cancelled
if (!pool.awaitTermination(60, TimeUnit.SECONDS))
System.err.println("Pool did not terminate");
}
} catch (InterruptedException ie) {
// (Re-)Cancel if current thread also interrupted
pool.shutdownNow();
// Preserve interrupt status
Thread.currentThread().interrupt();
}
}
- 1. Jak przerwać wątki ExecutorService?
- 2. Wyłączanie się ExecutorService
- 3. Executorservice i Runnable
- 4. Java ExecutorService and ThreadPoolExecutor
- 5. Jak zatrzymać zgłoszenie przesłane do ExecutorService?
- 6. Zatrzymaj Runnable przesłane do ExecutorService
- 7. Tracking zrealizowanych zadań w ExecutorService
- 8. Jak zamknąć obraz?
- 9. Jak zamknąć serwer com.sun.net.httpserver.HttpServer?
- 10. Jak zamknąć gałąź-podwersję?
- 11. Jak zamknąć PushViewController?
- 12. jak zamknąć podpowiedź jQuery
- 13. Jak zamknąć oddział Git?
- 14. Jak mogę zamknąć Teamcity?
- 15. Jak zamknąć komputer?
- 16. Jak zamknąć terminal Geany
- 17. Jak prawidłowo zamknąć log4j2
- 18. Aby zamknąć lub nie zamknąć połączenia Oracle?
- 19. Jak programowo zamknąć lub zamknąć program Windows Phone 8?
- 20. Jak programowo zamknąć lub zamknąć aplikację UWP? (Windows 10)
- 21. Jak zamknąć przeglądarkę z Capybara?
- 22. Jak zamknąć pliki z tempfile.mkstemp?
- 23. Jak zamknąć ViewPart w Eclipse?
- 24. Jak skutecznie zamknąć połączenie SerialPort?
- 25. Jak zamknąć okno wyskakujące Liferay.util.openWindow?
- 26. Skrypt CMD: Jak zamknąć CMD
- 27. Jak zamknąć otwarte okno zaćmienia
- 28. Jak zamknąć wątek od wewnątrz?
- 29. Narzędzia jQuery: Jak zamknąć nakładkę?
- 30. Jak programowo zamknąć okno komunikatu?
Proszę zaznaczyć właściwą odpowiedź jako zaakceptowany – gonephishing