2015-04-06 16 views
5

C'è un programma esterno che crea un file XML, ma potrebbe volerci un po 'di tempo per essere creato. Ho bisogno del mio programma Java per aspettare che il file esista prima di andare avanti.Come posso aspettare che un file esista prima di continuare

ho letto un po 'di blocchi sincronizzati, e ho letto che posso fare qualcosa di simile:

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

Ad essere onesti non so molto sulle attività sincronizzate in modo da Mi chiedo se sono sulla strada giusta, o se sono lontano.

+0

Dare un po 'di attesa (lungo timeout); in modo che dopo lo stesso thread temporale dovrebbe svegliarsi. – Prashant

+5

No. Questo non è affatto il modo in cui funziona, dimentica 'sincronizzato'. Puoi 1) aspettare che il programma finisca, o scrivere qualcosa dal programma allo stdout quando il programma scrive il file; oppure 2) utilizzare un [WatchService'] (http://stackoverflow.com/q/16251273/2071828) per tenere traccia delle modifiche alle directory. –

+1

In primo luogo, 'sincronizzato' è correlato ai programmi multithread. In secondo luogo, il programma esterno è in esecuzione indipendente dal tuo programma java o il tuo programma java lancia questo programma esterno? –

risposta

0

Quindi quello che ho passato è un ciclo while che controlla se il file non esiste. Se non lo fa, metto il Thread a dormire per un secondo. Sembra che funzioni correttamente. Grazie per l'aiuto.

+0

Si consiglia di esaminare gli approcci basati sugli eventi, ad esempio 'WatchService', piuttosto che l'approccio loop-and-poll. Ti servirà per allontanarti da abitudini arcane e per lo più corrucciate. –

+0

Ya, non mi piace neanche il metodo di polling. Dò un'occhiata a WatchService. – namxal

-3

A mio parere, dovresti avere qualcosa da notificare al thread. Quello che segue è il mio esempio.

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

Questo non funzionerà con programmi esterni. –

+0

@ColonelThirtyTwo Thirty Two no funziona bene. Il risultato è 'before wait: prima di creare un nuovo file: dopo aver creato un nuovo file: dopo l'attesa:' – uttp

+1

Aspettare cosa? 'createFile' si trova in un programma esterno e non può notificare il thread' findFile'. –

3

Un modo tipico per risolvere questo problema è che il proprio XML writer crei il file XML e, una volta terminato, dovrebbe creare un secondo file che dice che il lavoro è stato svolto.

Il programma java deve rilevare l'esistenza del file .done anziché del file XML.

Non funzionerà se non si ha alcun controllo sull'applicazione di scrittura XML, comunque.

Problemi correlati