2013-04-20 15 views
8

In Java habe ich eine Funktion, die eine Textdatei auf eine bestimmte Weise verarbeitet. Wenn es jedoch zu viel Zeit in Anspruch nimmt, wird der Prozess wahrscheinlich (aus welchem ​​Grund auch immer) nutzlos für diese Textdatei sein und ich möchte sie überspringen. Wenn der Prozess zu lange dauert, verbraucht er außerdem zu viel Speicher. Ich habe versucht, es auf diese Weise zu lösen, aber es funktioniert nicht:Funktion überspringen, wenn es zu lange dauert

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

wo docs nur List von Dateien in einem Verzeichnis. Normalerweise muss ich den Code manuell stoppen, weil er bei einer bestimmten Datei hängt (abhängig vom Inhalt dieser Datei).

Gibt es eine Möglichkeit, die Zeit für diesen Funktionsaufruf zu messen und Java zu sagen, die Datei zu überspringen, braucht die Funktion mehr als 10 Sekunden?

EDIT
Nach ein paar verschiedenen Antworten zusammen Schaben kam ich mit dieser Lösung auf die gut arbeitet. Vielleicht kann jemand anderes die Idee auch benutzen.

zuerst eine Klasse erstellen, die fahrbare (diese Weise können Sie in Argumenten zu dem Thread passieren können, wenn erforderlich) implementiert:

public class CustomRunnable implements Runnable { 

    Object argument; 

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

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

Dann diesen Code in der main Klasse verwenden, um die Zeit eine Funktion zur Überwachung (argument.doFunction()) und Ausgang, wenn es dauert zu lange:

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) {} 
    } 
} 

ich weiß, stop() depcecated ist, aber ich habe andere Art und Weise nicht gefunden, den Faden zu stoppen und zu beenden, wenn ich es beenden möge.

+1

einen Blick auf diese: [http://stackoverflow.com/questions/8982420/time-out-method-in-java][1] [1]: http://stackoverflow.com/questions/8982420/time-out-method-in-java –

+0

Das half mir meine Lösung zu erreichen, dank :) – Tim

Antwort

8

Wickeln Sie Ihren Code in eine Runnable oder Callable und reichen Sie es an einen geeigneten Executor, um es auszuführen. Eine der Submit-Methoden benötigt eine Zeitüberschreitung, nach deren Ablauf der Code unterbrochen wurde.

+0

ich habe gesucht kurz für die Schnittstellen und das scheint die richtige Antwort auf das Problem zu sein. Ich weiß aber noch nicht wie es geht. Ich schaue hinein. – Tim

+0

Können Sie ein Beispiel geben? – CMCDragonkai

0

Sie können System.nanoTime() Inside-Run-Methode als Bedingung verwenden.

Zum Beispiel

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