2011-08-09 12 views
6

Muszę napisać "WatchDog" w Javie, który zapewnia, że ​​wątki nie działają zbyt długo. Przy inicjalizacji obiektów nie stanowi problemu, stworzyłem klasę, która wywołuje WatchDog i konstruktor z odbiciami w metodzie run().Jak zabezpieczyć metody w java (przepełnienie itd.)

Wątek można łatwo zatrzymać, ale w jaki sposób mogę zabezpieczyć normalne metody obiektów? Na przykład nazywam metodę obiektu, a ta metoda wykonuje pętlę nieskończoną, jak by to zrobić?

dzięki

+0

Może aspekty się powiodą? –

+0

"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

+0

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

Odpowiedz

3

normalnymi metodami obiektów są wyświetlane na niektóre gwintu. To może być dyspozytor zdarzeń AWT lub jak się nazywa. Lub może to być główny wątek aplikacji konsoli.

Nie różnią się one od wątków, które są wywoływane za pomocą nowego wątku().

Zgaduję, że twój watchdog musi patrzeć na wszystkie wątki w VM i szukać tych, które mają wykorzystanie> = pewien próg.

Jaki kod masz do tej pory?

Rich

+0

okey, może opisałem to źle, daję mojemu watchdogowi wszystkie wątki, które chcę obserwować. Chcę tylko zainicjować obiekt i uruchomić każdą metodę w wątku i nadać ten wątek mojemu organowi nadzoru. – Nicolas

+0

Witam Mikołaju Czy możesz się z tym rozwodzić? W szczególności "Chcę tylko zainicjować obiekt i uruchomić każdą metodę w wątku, i dać ten wątek mojemu watchdogowi". część. Mogę pomóc, ale nie rozumiem, co robisz. – RichColours

+0

Oto mój kod dla bezpiecznej instancji i bezpiecznej metody wywoływania: http://pastebin.com/v8kdvdUW Mam nadzieję, że rozumiesz, co chcę zrobić. – Nicolas

4

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:

  1. startMethod(maxTime) by dodać wpis do kolejki czasu wygaśnięcia now + maxTime. Pozycja będzie zawierać odniesienia do aktualnej wątku (gdy metodę.
  2. endMethod() wyglądają na A() wejścia kolejek dla bieżącego wątku i usunąć, jeśli stwierdzono,
  3. 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.

+0

To jest poprawny sposób rozwiązania problemu. Nie mam pojęcia, dlaczego nie wybrano go jako odpowiedzi. Jeśli ktoś chce po wyjęciu z pudełka, wypróbuj @ Timeable as @ yegor256 przedstawiony. Ale to nie rozwiązuje problemu "Czyszczenie po przerwie". Osobiście nadal piszę swój własny aspekt. –

1

Spróbuj użyć @Timeable adnotacji z jcabi-aspects:

public class Resource { 
    @Timeable(limit = 5, unit = TimeUnit.SECONDS) 
    public String load(URL url) { 
    return url.openConnection().getContent(); 
    } 
} 

Twoja metoda zostanie przerwane po przekroczeniu tego limitu.

Powiązane problemy