2016-09-20 4 views
3

ich eine JavaFX-Anwendung haben, die damit verbunden mehrere Methoden hat, und es ist eine Methode, wie alles, was wieAufruf Platform.runLater für mehrere Aufgaben in JavaFX-Anwendung

DFF 
Lookup 
Profile 
Everything 

Everything fordert alle diese Methoden alle Methoden aufruft Ich versuche Threading auf Everything Methoden zum Aufruf dieser Methoden zu implementieren und dann nach der List s Popuplated übertrage ich das Steuerelement in eine andere fxml, um es in der Tabellenansicht mit Registerkarte anzuzeigen.

public void runEverything(){ 
    List<Task> tasks = new ArrayList(); 

    Task task = new Task() { 
     protected Object call() throws Exception {     
      dataAOL = aol.getAolReport(InstanceController.validateto, InstanceController.validatefrom, pattern.getText()); 
      System.out.println("Method"+AOLScreenController.dataAOL.size());    

      return null; 
     } 

    }; 
    Task task1 = new Task() { 
     protected Object call() throws Exception {     
      dataProfile = aol.getAolReport(InstanceController.validateto, InstanceController.validatefrom, pattern.getText()); 
      System.out.println("Method"+AOLScreenController.dataAOL.size());     

      return null; 
     } 

    }; 

    tasks.add(task); 
    tasks.add(task1); 

    ExecutorService threadPool = Executors.newFixedThreadPool(5); 
    for (Task t : tasks) {    
     threadPool.submit(t); 
    } 
    threadPool.shutdown(); 
} 

Ich brauche nur einmal die Platform.runLater Methode aufrufen, nachdem alle Threads die Ausführung beendet haben, so dass ich die fxml Ansicht laden und in den Mitteln, während ein Fortschrittsbalken Schleife in der neuen fxml und ui wird hinken nicht. aber ich weiß nicht, wo mein Platform.runLater Code platzieren

Platform.runLater(new Runnable() { 
    @Override public void run() { 
     try { 
      Parent parent = FXMLLoader.load(getClass().getResource("AolRun.fxml")); 
      SmartCC.fxmlval.add("AOLScreen.fxml"); 
      SmartCC.stageval.add((Stage) run.getScene().getWindow()); 
      Stage stage = new Stage(); 
      stage.initStyle(StageStyle.UTILITY); 
      stage = (Stage) run.getScene().getWindow(); 
      Scene scene = new Scene(parent); 
      stage.setScene(scene); 
      scene.getStylesheets().add("/css/Style.css"); 
      stage.setTitle("AOL Output "); 
      stage.setResizable(false); 
      stage.show(); 
     } catch (IOException ex) { 
      Logger.getLogger(AOLScreenController.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
}); 

Wenn ich es in der letzten Aufgabe platzieren gibt es Thread-Synchronisation Fehler und ich weiß nicht, darüber.
Ich bin sehr neu zu Threads und Javafx Themen bitte helfen

Antwort

3

Sie könnten einfach einen onSucceded Handler zu den Aufgaben hinzufügen. Dieser Handler wird für den Anwendungsthread nach dem erfolgreichen Abschluss der Tasks ausgeführt:

+0

Entschuldigen Sie, dass wir diesen Fabian fragen, aber was müssen wir bei jeder dieser Aufgaben zu dieser Methode hinzufügen und warum auch nicht? using platform.runlater method here –

+0

@RahulSingh 'Task' stellt sicher, dass der' onSuceeded' Handler-Code auf dem JavaFX-Anwendungsthread ausgeführt wird, was Sie auch erreichen, indem Sie 'Platform.runLater' verwenden. Außerdem müssen Sie dies zu jeder Aufgabe hinzufügen, um zu wissen, wann die letzte beendet ist (AFAIK, wenn Sie den Code für die Bühnenerstellung aufrufen möchten). – fabian

+0

Danke, es funktioniert, aber ein Problem hier ist, dass 9 von 10 mal funktioniert, aber manchmal ist es dort stecken Thread Probleme Synchronisierung hier, als wenn ich es auf eine Aufgabe stecken und nicht vorwärts bewegen. –

Verwandte Themen