Po pierwsze, należy wskazać, że zatrzymanie wątku jest NIE łatwe. W rzeczywistości, w ogólnym przypadku, nici nie może być zatrzymany bezpiecznie:
Można zadzwonić Thread.interrupt()
na nitce chcesz się zatrzymać, ale nie ma gwarancji, że wątek nie zauważy przerwania, nie mówiąc już faktycznie zatrzymać.
Możesz wywołać nieaktualną metodę Thread.stop()
, ale ta metoda jest niebezpieczna. Jeśli nazwiesz to w nieszczęśliwym momencie, możesz pozostawić struktury danych w stanie pół aktualizacji, pozostawiając inne wątki oczekujące (na zawsze) na sygnały, które nie dotrą i tak dalej.
Oto jak bym wdrożyć watchdog na wykonanie metody.
Najpierw zmodyfikuję metodę dodawania dwóch wywołań do usługi nadzoru; na przykład
public void someMethod(...) {
Watchdog.startMethod(maxTime);
// do stuff
Watchdog.endMethod();
}
Następnie chciałbym wdrożyć Watchdog z kolejki priorytetowej zamówionej na czas ważności:
startMethod(maxTime)
by dodać wpis do kolejki czasu wygaśnięcia now + maxTime
. Pozycja będzie zawierać odniesienia do aktualnej wątku (gdy metodę.
endMethod()
wyglądają na A() wejścia kolejek dla bieżącego wątku i usunąć, jeśli stwierdzono,
- Gwint watchdog okresowo spójrz na pierwszy wpis kolejki.Jeśli wpis ten miał termin wygaśnięcia mniejszy niż "teraz", watchdog usunie wpis, zatrzyma jego wątek i sprawdzi następny wpis Powtarzaj do momentu, aż następny wpis nie wygasł.
Należy zastanowić się nad strukturą danych i poradzić sobie z przypadkami, w których połączenia endMethod
są pomijane. (Rzeczywiście, ponieważ wywołanie metody może wypowiedzieć ze względu na wyjątek, wywołanie endMethod()
naprawdę należy zrobić w finally
bloku.)
Uwaga że startMethod
i endMethod
połączenia mogłoby (i być może powinien) być wstawiony przez adnotacją procesor lub coś w tym stylu.
Biorąc pod uwagę złożoność i fakt, że nie można zagwarantować, aby zatrzymać wątek (bezpiecznie), to myślę o jakimś rozwiązaniu, które nie wiąże się metodę watchdog.
Może aspekty się powiodą? –
"Wątek jest łatwy do zatrzymania", nie, nie jest. Nie rozumiem "w jaki sposób mogę zabezpieczyć normalne metody obiektów?", Ani przykładu, który następuje po nieskończonej pętli. – toto2
http://download.oracle.com/javase/7/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html Przeczytaj to wszystko, a następnie sprawdź, czy nadal chcesz zadzwonić stop(). Może jakieś myślenie poza przysłowiowym pudełkiem jest konieczne, aby obejść twój problem. – RichColours