Пропустить функцию, если это занимает слишком много времени
В Java у меня есть функция, которая обрабатывает текстовый файл определенным образом. Однако, если это займет слишком много времени, процесс, скорее всего, будет бесполезным (независимо от причины) для этого текстового файла, и я хотел бы пропустить его. Кроме того, если процесс занимает слишком много времени, он также использует слишком много памяти. Я пытался решить это таким образом, но это не работает:
for (int i = 0; i<docs.size(); i++){
try{
docs.get(i).getAnaphora();
}
catch (Exception e){
System.err.println(e);
}
}
гдеdocs
это простоList
файлов в каталоге. Обычно мне приходится вручную останавливать код, потому что он «застрял» в определенном файле (в зависимости от содержимого этого файла).
Есть ли способ измерения времени для вызова этой функции и указания Java пропустить файл, функция занимает, скажем, более 10 секунд?
РЕДАКТИРОВАТЬ
Собрав несколько разных ответов вместе, я пришел к этому решению, которое отлично работает. Возможно, кто-то еще может использовать эту идею.
Сначала создайте класс, который реализует Runable (таким образом, при необходимости вы можете передавать аргументы в Thread):
public class CustomRunnable implements Runnable {
Object argument;
public CustomRunnable (Object argument){
this.argument = argument;
}
@Override
public void run() {
argument.doFunction();
}
}
Затем используйте этот код вmain
класс для контроля времени функции (argument.doFunction()
) и выйдите, если это займет много времени:
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) {}
}
}
я понимаюstop()
устарел, но я не нашел другого способа остановить и выйти из потока, когда я хочу остановить его.