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ć.
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 –
To pomogło mi osiągnąć moje rozwiązanie, dzięki :) – Tim