2010-07-06 17 views
5

Chcę wiedzieć, jak zatrzymać wykonywanie określonej funkcji w określonym czasie w java.Czy jest możliwe zatrzymanie wykonywania funkcji w określonym czasie w Javie?

Na przykład: Mogę wywołać funkcję o nazwie print_data(). Jeśli zajmie to więcej czasu, będę musiał zatrzymać wykonywanie tej funkcji.

Czy można zatrzymać wykonywanie w ten sposób?

Dzięki z góry

+0

Można wykonać tę funkcję w osobnym wątku, a następnie przerwać wątek po pewnym okresie czasu. – BobbyShaftoe

+0

Przepraszam, że nie używałem wątku w programie, czy istnieje jakaś inna możliwość? –

Odpowiedz

4

Można dodać kilka czeków do funkcji: Zapisz znacznik czasu, gdy funkcja rozpoczął pracę, a następnie okresowo sprawdzając, wewnątrz funkcji, rzuca wyjątek, jeśli funkcja trwa zbyt długo.

Jest to najczystszy sposób na wykonanie tego zadania w Javie.

+0

Zacząłem myśleć o wątku z timerem i mechanizmie do przerywania procesu, ale jeśli drukowanie odbywa się w pętli, twoja metoda jest znacznie prostsza i bardziej efektywna. +1. –

2

Można użyć TimeUnit enum z java.util.concurrent, w szczególności z metody timedJoin.

Określasz czas oczekiwania i wątek. timedJoin spowoduje, że wątek zostanie wykonany do zakończenia, lub zatrzyma się, jeśli przetwarzanie zajmie więcej czasu niż dozwolony limit czasu. Możesz użyć anonimowej klasy, aby łatwo opakować swoją metodę w obiekt Thread.

To może być tak proste, jak:

SECONDS.timedJoin(
    new Thread() { 
     public void run() { 
     print_data(); 
     } 
    }, 
    10);  

dla timeout 10 sekund.

3

Nie ma bezpiecznego sposobu zatrzymania wykonywanego wątku, chyba że jest to współpraca; na przykład regularnie sprawdza flagę "przerwaną".

@BobbyShaftoe sugeruje w komentarzu:

Można wykonać tę funkcję w osobnym wątku, a następnie przerwać wątek po pewnym okresie czasu.

To myląca i niebezpieczna rada. Jedynym sposobem na "przerwanie" wątku jest użycie wycofanej metody Thread.stop(). Jeśli spojrzysz na javadoc dla tej metody, zobaczysz, że jest to zasadniczo niebezpieczna metoda, która może mieć niepożądane i nieprzewidywalne skutki uboczne.

Należy również zauważyć, że rozwiązanie @ tonio nie zatrzymuje wykonywania funkcji. Po prostu przestaje czekać na zakończenie funkcji. Funkcja może kontynuować działanie bezterminowo, przeżuwając zasoby, by nie osiągnąć dobrego efektu.

+0

+1 @Stephen C: Dla zatrzymania pomiędzy faktycznym zatrzymaniem egzekucji i po prostu ignorowaniem po upływie czasu oczekiwania na zakończenie sesji. – bguiz

Powiązane problemy