ExecutorService zabijanie wątków

0
ExecutorService executorService = Executors.newCachedThreadPool();

Mam taki problem że zadanie które jest wrzucane do executora może się zawiesić, teraz problem pojawia się taki że przez to że nie ubijam tych wątków to rosną w nieskończoność.
Nawet nie pomaga:

executorService.shutdownNow();
executorService = Executors.newCachedThreadPool();

wywołanie cancel() na Future też nie pomaga...
Jak zabić te wiszące wątki? Jest jakiś sposób na brutalne zabicie?

0

Pytanie zasadnicze. Na czym te wątki wiszą? Jaka operacja?

0

wątek zapisuje przekazane dane do strumienia wyjściowego (TCP/IP) który ma pełny bufor przez co wątek zawisa na output.write(data); i operacje wymienione wyżej go nie ubijają

0

Zobacz do dokumentacji: https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html#shutdownNow()
Nie ma gwarancji, że ubije wątki. A jakby, żeby pomóc tej metodzie, spróbować dodać w run jakiś if albo while z:

!isInterrupted()
0

W zależności jakiego clienta używasz Socket, httpclient czy co tam jeszcze.. poustawiaj timeouty. So_timeout i inne. Np. na 10 sekund.

0

Executor.shutdownNow nie ubija już odpalonych zadań, ale za to nie odpala tych czekających w kolejce. Future.cancel działa podobnie - jeśli Future nie jest jeszcze odpalona to nie będzie. Jeśli już jest odpalona to nie zostanie przerwana.

Poprawne przerywanie zadań/ wątków/ etc polega na wysłaniu sygnału interrupt, złapaniu go i np przerwaniu pętli. Dodatkowo możesz ustawić jakiś stan mówiący z jakiego powodu przerwałeś zadanie.

https://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html

0

wszystko leci po najzwyklejszych Socket'ach wysyłanie danych na OutputStream i wątek zwisa na metodzie outputStream.write(dane); (wysylanie serwera zawisa w nieskończoność) więc wysłanie komunikatu interrupt odpada.

0

z tego co wiem to Socket.setSoTimeout jest tylko dla odczytywania. Finalnie jestem na etapie testowania AsynchronousSocketChannel i na razie wyglada że działa jak powinno:

asynchronousSocketChannel.write(byteBuffer, WRITE_TIMEOUT, TimeUnit.MILLISECONDS, null, completionHandler);
0

Kiedyś rozkminiałem podobny problem i z początku użyłem hystrix'a od netflixa (ho ho ho jaki rym). W końcu znalazłem jakieś prostsze rozwiązanie, ale nie pamiętam, w pracy zobaczę co to było :)
EDIT: Jednak to nie rozwiąże twojego problemu

1 użytkowników online, w tym zalogowanych: 0, gości: 1