2009-09-02 10 views
5

Potrzebuję użyć przestarzałego stop(), ponieważ muszę uruchomić Runnable klas, które zostały opracowane przez innych programistów i nie mogę używać while (isRunning == true) wewnątrz metody uruchomienia.Czy mogę używać thread.stop() w Javie, jeśli naprawdę tego potrzebuję?

Pytanie brzmi: czy jest wystarczająco bezpieczne, aby użyć metody stop()? Theads nie działają z żadnymi zasobami (takimi jak pliki, DB lub połączenia internetowe). Ale chcę mieć pewność, że JVM nie zostanie uszkodzone po zatrzymaniu tuzina wątków metodą stop().

P.S .: Tak, mogę napisać kod, aby go przetestować, ale mam nadzieję, że ktoś zna odpowiedź)

Odpowiedz

6

Rodzaju. Nie ma nic z natury "korupcji" o Thread.stop(). Problem polega na tym, że może pozostawić obiekty w stanie uszkodzonym, gdy nagle wykonywany przez nie wątek przestanie działać. Jeśli reszta programu nie ma widoczności dla tych obiektów, to jest w porządku. Z drugiej strony, jeśli niektóre z tych obiektów są widoczne dla reszty programu, mogą pojawić się problemy, które trudno jest zdiagnozować.

+0

Gdyby obiekty zostały "uszkodzone" logicznie, ale nie fizycznie, to w tym przypadku nie obchodzi mnie to)) – Roman

0

Maszyna JVM nie będzie uszkodzona, ale przeczytaj uważnie javadocs, aby upewnić się, że nie spełniasz warunków "katastrofy".

Musisz dokładnie przyjrzeć się synchronizacji monitorującej, że wątek się trzyma. Wspomniałeś o plikach i gniazdach, gdy zasoby były zawieszone, ale musisz także wziąć pod uwagę wszelkie struktury danych. Upewnij się również, że obsługa wyjątków nie zostanie przechwycona przez RuntimeException s (patrz stop()).

4

Jeśli używasz Thread.stop prawdopodobnie uciec, zakładając, że masz niewielu użytkowników. Jest wyjątkowo trudny do przetestowania. Może spowodować wyjątek w dowolnym miejscu podczas wykonywania kodu. Nie możesz sprawdzić wszystkich możliwych sytuacji. Na twoim urządzeniu w konfiguracji nigdy nie znajdziesz problemu; następna aktualizacja JRE Twój program może się nie udać z bardzo nieczytelnym sporadycznym błędem.

Przykładowy problem to sytuacja, w której wątek ładuje klasę w danym momencie. Klasa nie może się załadować i nie będzie ponawiana ponownie. Program jest zepsuty.

1

Powiedziałem to w moim pytaniu "Are thread stop and friends ever safe?", a w jednej z odpowiedzi próbowałem ustalić warunki wstępne, dzięki którym można bezpiecznie używać stop(). Ale to wciąż "praca w toku".

BTW: pisanie kodu testu niekoniecznie pomoże. (Testy dowodzą tylko obecności błędów, a nie braku błędów.) Lepiej byłoby próbować uzasadnić ten problem, IMO. Ale to nie jest łatwe :-).

Powiązane problemy