2015-04-06 15 views
5

Es gibt ein externes Programm, das eine XML-Datei erstellt, aber es kann eine Weile dauern, zu erstellen. Ich brauche mein Java-Programm, um zu warten, bis die Datei existiert, bevor ich fortfahre.Wie kann ich meine Methode warten, bis eine Datei existiert, bevor Sie fortfahren

Ich habe ein wenig über synchronisierte Blöcke zu lesen, und ich las, dass ich etwas tun kann:

synchronized(this) { 
    while (!file.exists) { this.wait(); } 
} 

Um ehrlich zu sein, ich weiß wirklich nicht viel wissen über synchronisierte Aufgaben so ich Ich frage mich, ob ich auf dem richtigen Weg bin oder ob ich weit weg bin.

+0

Zeitüberschreitung warten (langes Timeout); damit nach der gleichen Zeit Faden aufwachen sollte. – Prashant

+5

Nein. Das ist ganz und gar nicht wie das funktioniert, vergessen Sie "synchronisiert". Sie können entweder 1) auf das Beenden des Programms warten oder etwas aus dem Programm in stdout schreiben, wenn das Programm die Datei schreibt; oder 2) verwenden Sie einen ['WatchService'] (http://stackoverflow.com/q/16251273/2071828), um Verzeichnisänderungen zu verfolgen. –

+1

Erstens bezieht sich 'synchronized' auf Multithread-Programme. Zweitens läuft das externe Programm unabhängig von Ihrem Java-Programm, oder Ihr Java-Programm startet dieses externe Programm? –

Antwort

0

Also was ich gegangen bin, ist eine while-Schleife, die überprüft, ob die Datei nicht existiert. Wenn nicht, lege ich den Thread eine Sekunde lang schlafen. Es scheint richtig zu funktionieren. Danke für die Hilfe.

+0

Ich würde empfehlen, dass Sie eher ereignisgesteuerte Ansätze wie "WatchService" betrachten, anstatt den Ansatz "Schleife und Poll". Es wird Ihnen gut tun, sich von arkanen und meist verpönten Gewohnheiten abzuwenden. –

+0

Ja, ich mag auch die Wahlmethode nicht. Ich schaue mir WatchService an. – namxal

-3

Meiner Meinung nach sollten Sie etwas haben, um den Thread zu benachrichtigen. Das folgende ist mein Beispiel.

public class Test { 
File file; 
public Test(File file){ 
    this.file = file; 
} 

public void findFile(){ 
    synchronized(this){ 
     while(!file.exists()){ 
      try { 
       System.out.println("before wait:"); 
       this.wait(); 
       System.out.println("after wait:"); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

public void createFile(){ 
    synchronized(this){ 
     try { 
      System.out.println("before create a new file:"); 
      file.createNewFile(); 
      System.out.println("after create a new file:"); 
      this.notify(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

public static void main(String[] args){ 
    Test t = new Test(new File("/Users/yehuizhang/Desktop/uttp.txt")); 
    Thread t1 = new Thread(new FindFile(t)); 
    Thread t2 = new Thread(new CreateFile(t)); 
    t1.start(); 
    t2.start(); 
} 
} 

class FindFile implements Runnable{ 
Test t; 
public FindFile(Test t){ 
    this.t = t; 
} 

@Override 
public void run(){ 
    t.findFile(); 
} 
} 

class CreateFile implements Runnable{ 
Test t; 

public CreateFile(Test t){ 
    this.t = t; 
} 

@Override 
public void run(){ 
    t.createFile(); 
} 
} 
+0

Dies funktioniert nicht für externe Programme. –

+0

@ColonelThirtyTwo Zweiunddreißig nein, es funktioniert gut. Das Ergebnis ist 'before wait: vor dem Erstellen einer neuen Datei: nach dem Erstellen einer neuen Datei: nach warten:' – uttp

+1

Warten auf was? 'createFile' befindet sich in einem externen Programm und kann den 'findFile'-Thread nicht benachrichtigen. –

3

Ein typischer Weg zur Lösung dieses Problems besteht darin, dass der XML-Writer die XML-Datei erstellt, und wenn sie fertig ist, sollte sie eine zweite Datei erstellen, die besagt, dass die Arbeit erledigt ist.

Ihr Java-Programm sollte auf die Existenz der .DONE-Datei anstelle der XML-Datei hören.

Funktioniert nicht, wenn Sie keine Kontrolle über die Anwendung zum Schreiben von XML haben.

Verwandte Themen