2013-04-20 30 views
8

W Javie mam funkcję, która przetwarza plik tekstowy w określony sposób. Jednakże, jeśli zajmie to zbyt dużo czasu, proces najprawdopodobniej będzie bezużyteczny (niezależnie od przyczyny) dla tego pliku tekstowego i chciałbym go pominąć. Ponadto, jeśli proces trwa zbyt długo, wykorzystuje zbyt dużo pamięci. Starałem się go rozwiązać w ten sposób, ale to nie działa:Funkcja pomijania, jeśli trwa zbyt długo

for (int i = 0; i<docs.size(); i++){ 
    try{ 
     docs.get(i).getAnaphora(); 
     } 
    catch (Exception e){ 
     System.err.println(e); 
    } 
} 

gdzie docs tylko List plików w katalogu. Zazwyczaj muszę ręcznie zatrzymać kod, ponieważ jest "zablokowany" w konkretnym pliku (w zależności od zawartości tego pliku).

Czy istnieje sposób pomiaru czasu dla tego wywołania funkcji i nakazania Javy pominięcia pliku, którego funkcja zajmuje więcej niż, powiedzmy, 10 sekund?

EDIT
Po skrobanie kilka różnych odpowiedzi razem wpadłem na to rozwiązanie, które działa prawidłowo. Być może ktoś inny może również użyć tego pomysłu.

Najpierw należy utworzyć klasę, która implementuje Runable (w ten sposób można przejść w argumenty do wątku, jeśli jest to konieczne):

public class CustomRunnable implements Runnable { 

    Object argument; 

    public CustomRunnable (Object argument){ 
     this.argument = argument; 
} 

    @Override 
    public void run() { 
     argument.doFunction(); 
    } 
} 

następnie użyć tego kodu w klasie main monitorować czas funkcji (argument.doFunction()) oraz wyjście jeśli trwa długo:

Thread thread; 
for (int i = 0; i<someObjectList.size(); i++){   
    thread = new Thread(new CustomRunnable(someObjectList.get(i))); 
    thread.start(); 
    long endTimeMillis = System.currentTimeMillis() + 20000; 
    while (thread.isAlive()) { 
     if (System.currentTimeMillis() > endTimeMillis) { 
     thread.stop(); 
     break; 
    } 
    try { 
     System.out.println("\ttimer:"+(int)(endTimeMillis - System.currentTimeMillis())/1000+"s"); 
     thread.sleep(2000); 
     } 
    catch (InterruptedException t) {} 
    } 
} 

Zdaję sobie sprawę stop() jest depcecated, ale nie znalazłem żadnego innego sposobu, aby zatrzymać i zamknąć wątek, gdy chcę go zatrzymać.

+1

Spójrz na to: [http://stackoverflow.com/questions/8982420/time-out-method-in-java][1] [1]: http://stackoverflow.com/questions/8982420/time-out-method-in-java –

+0

To pomogło mi osiągnąć moje rozwiązanie, dzięki :) – Tim

Odpowiedz

8

Zawiń kod w pliku Runnable lub Callable i prześlij go do odpowiedniego Executora, aby go wykonać. Jedna z metod przesyłania przyjmuje limit czasu, po upływie którego kod został przerwany.

+0

rozglądałem krótko do interfejsów i wydaje się, że to właściwa odpowiedź na problem. Jednak nie wiem jak to zrobić. Przyjrzę się temu. – Tim

+0

Czy jesteś w stanie podać przykład? – CMCDragonkai

0

Możesz użyć System.nanoTime() wewnątrz metody uruchamiania jako warunku.

Na przykład

long cur = System.nanoTime(); //records the time when start executing 
... 
double elapsedTime(System.nanoTime() - cur)/1000000.0; // at the end 
Powiązane problemy