ExecutorService zabijanie wątków

Odpowiedz Nowy wątek
2019-03-11 14:36
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?

edytowany 1x, ostatnio: darksead, 2019-03-11 14:37

Pozostało 580 znaków

2019-03-11 14:45
0

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


Bardzo lubie Singletony, dlatego robię po kilka instancji każdego.

Pozostało 580 znaków

2019-03-11 15:07
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ą

Pozostało 580 znaków

2019-03-11 15:30
0

Zobacz do dokumentacji: https://docs.oracle.com/javas[...]torService.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()

Pozostało 580 znaków

2019-03-11 18:06
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.


Bardzo lubie Singletony, dlatego robię po kilka instancji każdego.

Pozostało 580 znaków

2019-03-11 18:47
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/javas[...]al/concurrency/interrupt.html


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.

Pozostało 580 znaków

2019-03-11 22:10
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.

edytowany 1x, ostatnio: darksead, 2019-03-11 22:11

Pozostało 580 znaków

2019-03-12 12:42
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);

Pozostało 580 znaków

2019-03-13 00:12
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

edytowany 1x, ostatnio: orchowskia, 2019-03-13 09:19

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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