Jarosław Czub

Jarosław Czub FullStack Developer

Temat: Zabijanie wątków potomnych

Hellow,

w aplikacji którą piszę, wystąpił błąd w ten sposób ze w przypadkowym czasie od uruchomienia potrafi się zawiesić w ten sposób, że w ogóle przestaje odpowiadać.
Kilkudniowe badania i okazuje się ze na 64 bitowej JVM zawiesza się na bibliotekach Lucene (w bugtack'u od lucene jest to zaznaczone ale nie ma jeszcze przypisanego błędu), czyli to nie mój kod i nic nie zdziałam bez większego grzebania.

Czyli rozwiązujemy to w inny sposób, newralgiczne miejsce odpalam jako wątek potomny i w głównym badam czy jeszcze żyje, a jeżeli przestaje odpowiadać to go ubijam. I tu zoonk w testach wychodzi, że nie da się zabić wątku który nie odpowiada oraz nie reaguje na sygnały kierowane do niego.

Wszelkiej maści przykłady sa gdy wątek żyje i ma się świetnie, a jak wisi to
wszelkie metody typu: Thread.interrupted(); ExecutorService.shutdown(); itd nie działają.

Zresztą jak się doczytałem na forach to raczej nie da się tego wykonać. Oczywiście da się to obejść na inny sposób ale chciałem zrobić to jak przystało.

konto usunięte

Temat: Zabijanie wątków potomnych

... zabijanie wątków poprzez stop() chyba nigdy nie jest metodą "jak przystało" ;)
Jarosław Czub

Jarosław Czub FullStack Developer

Temat: Zabijanie wątków potomnych

No nie jest ;) to tak jak programem pod windę jak nie odpowiada to trzeba ubić :DJarosław Czub edytował(a) ten post dnia 12.09.10 o godzinie 12:08
Piotr Włodarek

Piotr Włodarek Enjoying programming
since '95

Temat: Zabijanie wątków potomnych

Prawdopodobnie moja odpowiedź nie przypadnie Ci do gustu i nie jest natychmiastowym rozwiązaniem Twojego problemu; niemniej:

1. Wątków nie można zabijać, trzeba je prosić by się zakończyły.

2. Klasyczne języki programowania, w tym Java, nie nadają się do pisania aplikacji wielowątkowych, mimo że usilnie i powszechnie się to robi.

3. Jeśli potrzebujesz solidnej współbieżności na platformie Javy, sugeruję zainteresować się językiem Clojure. Clojure gwarantuje brak deadlocków poprzez niezmienne (immutable) struktury danych i transakcyjną pamięć (software transaction memory).

--
rails, git, clojure - blog o technologicznych perełkach

konto usunięte

Temat: Zabijanie wątków potomnych

Do Piotra. Parafrazując - języki funkcyjne nie nadają się do rozwiązywania wielu problemów - mimo, że usiłuje się tak robić. Pewnie się trochę czepiam, ale - równie dobrze można powiedzieć wprost - naucz się zrobić to w Lispie - jak już się nauczysz to pewnie nie będzie Ci to potrzebne. :) Proszę zwrócić uwagę, że problem jest gdzieś na styku. Jak mi się coś takiego gdzieś zawiesi - to Clojure sobie poradzi? Jak? Ja osobiście mam raczej mało przyjemne doświadczenia z używaniem jythona. Być może Clojure sobie lepiej radzi. No, ale jestem ciekaw jak to miałby wyglądać. Mam wywołanie zewnętrznego API i coś mi się gdzieś wiesza... A system ma to wyłapać i posprzątać - tak, żeby na dłuższą metę zasoby nie wyciekały.

Co do tematu. Ja tam nie wiem jak bym to zrobił pod Windows. Powiem więcej bardzo się cieszę, że nie muszę się nad tym głębiej zastanawiać. Pod Linuxem - zrobiłbym proces, który coś by tam zapisywał do pliku, jak by nic się nie zapisało przez ustalony czas... Na początek prośbą, a jak nie - kill -9 i cześć.
Nie jest to dobre rozwiązanie, ale jak się nie da inaczej, trzeba tak. Można zadbać, żeby za bardzo zasoby nie cierpiały na tym kill -9. Poszukałbym jeszcze na forach, bo Lucyny wielu używa i zwykle jakoś tam to działa. Jest spora szansa, że ktoś już sobie poradził z problemem, ale opis jest słabo widoczny w sieci. Jest taki serwer - news.gmane.org - indeksuje listy mailowe i udostępnia wszystko jako news-grupy. Można się podłączyć thunderbirdem, czy tam Outlook Expressem i poczytać... Coś widziałem, nawet wspomniane Clojure ma swoją podgrupę - devel.

Następna dyskusja:

zamykanie wątków




Wyślij zaproszenie do