In Java ho una funzione che elabora un file di testo in un certo modo. Tuttavia, se impiega troppo tempo, il processo sarà probabilmente inutile (qualunque sia la ragione) per quel file di testo e vorrei saltarlo. Inoltre, se il processo richiede troppo tempo, utilizza troppa memoria. Ho cercato di risolvere in questo modo, ma non funziona:Salta la funzione se impiega troppo tempo
for (int i = 0; i<docs.size(); i++){
try{
docs.get(i).getAnaphora();
}
catch (Exception e){
System.err.println(e);
}
}
dove docs
è solo un List
di file in una directory. Di solito devo fermare manualmente il codice perché è "bloccato" in un particolare file (a seconda del contenuto di quel file).
C'è un modo di misurare il tempo per quella chiamata di funzione e dire a Java di saltare il file la funzione richiede più di, diciamo, 10 secondi?
EDIT
Dopo la raschiatura alcune risposte diverse insieme mi si avvicinò con questa soluzione che funziona bene. Forse qualcun altro può usare anche l'idea.
Innanzitutto creare una classe che implementi runable (in questo modo è possibile passare in argomenti al filo, se necessario):
public class CustomRunnable implements Runnable {
Object argument;
public CustomRunnable (Object argument){
this.argument = argument;
}
@Override
public void run() {
argument.doFunction();
}
}
quindi utilizzare questo codice nella classe main
di monitorare il tempo di una funzione (argument.doFunction()
) e di uscita, se necessario a lungo:
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) {}
}
}
mi rendo conto stop()
è depcecated, ma non ho trovato nessun altro modo per fermare e uscire il filo quando voglio che smetta.
Date un'occhiata a questo: [http://stackoverflow.com/questions/8982420/time-out-method-in-java][1] [1]: http://stackoverflow.com/questions/8982420/time-out-method-in-java –
Questo mi ha aiutato a raggiungere la mia soluzione, grazie :) brevemente – Tim