2013-03-05 13 views
8

Ich habe eine JavaFX-Anwendung, die mehrere Task Objekte instanziiert.JavaFX - warten auf Aufgabe zu beenden

Momentan ruft meine Implementierung (siehe unten) das Verhalten runFactory() auf, das die Berechnung unter einem Task-Objekt ausführt. Parallel dazu wird nextFunction() aufgerufen. Gibt es eine Möglichkeit, nextFunction() warten zu lassen, bis die vorherige Aufgabe abgeschlossen ist?

Ich verstehe thread.join() wartet, bis der laufende Thread abgeschlossen ist, aber mit GUIs gibt es zusätzliche Ebenen der Komplexität aufgrund der Ereignisversand Thread. Tatsächlich fügt das Hinzufügen von thread.join() am Ende des folgenden Code-Segments nur die UI-Interaktion ein.

Wenn es irgendwelche Vorschläge, wie nextFunction warten, bis seine vorherige Funktion zu machen, runFactory abgeschlossen ist, würde ich sehr dankbar sein.

Danke,

// High-level class to run the Knuth-Morris-Pratt algorithm. 
public class AlignmentFactory { 
    public void perform() { 
     KnuthMorrisPrattFactory factory = new KnuthMorrisPrattFactory(); 
     factory.runFactory(); // nextFunction invoked w/out runFactory finishing. 
     // Code to run once runFactory() is complete. 
     nextFunction() // also invokes a Task. 
     ... 
    } 
} 

// Implementation of Knuth-Morris-Pratt given a list of words and a sub-string. 
public class KnuthMorrisPratt { 
    public void runFactory() throws InterruptedException { 
     Thread thread = null; 
     Task<Void> task = new Task<Void>() { 

      @Override public Void call() throws InterruptedException { 
      for (InputSequence seq: getSequences) { 
       KnuthMorrisPratt kmp = new KnuthMorrisPratt(seq, substring); 
       kmp.align(); 

      } 
      return null; 
     } 
    }; 
    thread = new Thread(task); 
    thread.setDaemon(true); 
    thread.start(); 
} 

Antwort

19

Wenn Aufgaben, die Sie verwenden müssen setOnSucceeded und möglicherweise setOnFailed mit einem Logikfluss in Ihrem Programm zu erstellen, schlage ich vor, dass Sie auch eher runFactory() Rückkehr der Aufgabe machen, als es ausgeführt wird:

// Implementation of Knuth-Morris-Pratt given a list of words and a sub-string. 
public class KnuthMorrisPratt { 
    public Task<Void> runFactory() throws InterruptedException { 
     return new Task<Void>() { 

     @Override public Void call() throws InterruptedException { 
     for (InputSequence seq: getSequences) { 
     KnuthMorrisPratt kmp = new KnuthMorrisPratt(seq, substring); 
     kmp.align(); 

     } 
     return null; 
    } 
    }; 
} 

// High-level class to run the Knuth-Morris-Pratt algorithm. 
public class AlignmentFactory { 
    public void perform() { 
    KnuthMorrisPrattFactory factory = new KnuthMorrisPrattFactory(); 
    Task<Void> runFactoryTask = factory.runFactory(); 
    runFactoryTask.setOnSucceeded(new EventHandler<WorkerStateEvent>() { 
     @Override 
     public void handle(WorkerStateEvent t) 
     { 
      // Code to run once runFactory() is completed **successfully** 
      nextFunction() // also invokes a Task. 
     } 
    }); 

    runFactoryTask.setOnFailed(new EventHandler<WorkerStateEvent>() { 
     @Override 
     public void handle(WorkerStateEvent t) 
     { 
      // Code to run once runFactory() **fails** 
     } 
    }); 
    new Thread(runFactoryTask).start(); 
    } 
} 
+0

Dreen, ich mag deine Logik ... danke. Es macht durchaus Sinn. –

+0

Diese Lösung sieht effektiv aus. Das heißt, was ist der Vorteil dieses Ansatzes im Gegensatz zu etwas wie "Platform.runLater (nextFunction()") als letzten Schritt im Factory-Thread? – Vultan

+0

Dank einer Million, setOnFailed() gespeichert mich nach zwei Tagen kämpfen – Yahya

Verwandte Themen