2013-04-20 6 views
8

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.

+1

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 –

+0

Questo mi ha aiutato a raggiungere la mia soluzione, grazie :) brevemente – Tim

risposta

8

Avvolgere il codice in un Runnable o Callable e inviarlo a un Executor adatto per eseguirlo. Uno dei metodi di invio richiede un periodo di timeout dopo il quale il codice è stato interrotto.

+0

ho cercato per le interfacce e questa sembra la risposta giusta al problema. Non so come farlo, tuttavia. Ci penserò. – Tim

+0

Sei in grado di fare un esempio? – CMCDragonkai

0

È possibile utilizzare il metodo di esecuzione interno System.nanoTime() come condizione.

Per esempio,

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