2015-11-22 3 views
0

Как Itell JavaFX может дождаться завершения моего процесса без блокировки?Синхронизация между javafx и стандартным потоком

public LoadResult load(URL url) { 
    new Thread(() -> { 
     Platform.runLater(() ->{ 
      done = false; 
      engine.load(""); 
     }); 
     attesa(); 
    }).start(); 

    new Thread(() -> { 
     Platform.runLater(() ->{ 
      done = false; 
      engine.load(url.toString()); 
     }); 
     attesa(); 
    }).start(); 
    return new LoadResult(url, parsed, ex); 
} 

private void attesa(){ 
     while (!done){ 
      try { 
       Thread.sleep(10); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
} 

Я хочу, чтобы этот метод возвращает, когда переменная «сделано», правда, это означает, что моя pocess закончена. С моим кодом javafx не блокирует, но метод возвращается, когда процесс не завершен, поэтому переменная «parsed» имеет значение null. как я могу решить?

+0

вы пробовали 'присоединиться()' – Ramanlfc

+0

я не пробовал 'присоединиться()', вы можете сказать мне пример? – Daniele

ответ

0

Перемещение attesa(); вызова вне метода выполнения потоков, Жюста перед возвращением LoadResult

Проблемы заключается в вас ждут в другие потоки, а не ждать в текущий поток перед возвратом результата

EDIT : вы можете также использовать CompletableFuture следующим образом:

 CompletableFuture<LoadResult> future = CompletableFuture.supplyAsync(() -> { 
      LoadResult result = null; // load and build LoadResult 
      return result; 
     }); 

     future.thenAccept(result -> { /* do some stuff with result here */ } ); 
+0

если я это сделаю, я блокирую поток javafx, и я ничего не могу сделать – Daniele

+0

Итак, рассмотрим использование класса ExecutorService. Отправьте на него runnable, получите будущее и добавьте слушателя к нему, чтобы получить результат. Platform.runLater() предназначен для выполнения кода в потоке пользовательского интерфейса JavaFX, а не для выполнения некоторых сложных операций параллельно. – Prim

+0

Я использую «ExecutorService» в другом классе, когда мне приходится загружать много страниц, этот метод должен загружать 1 страницу, и он не может вернуться, пока страница не будет загружена укомплектовать 'Рез = exec.submit (() -> { в то время как (loaderPool.isEmpty()) { Thread.sleep (10); } погрузчик погрузчик = loaderPool.poll(); LoadResult г = Loader.load (URL); loaderPool.add (загрузчик); возвращение г; }); tasks.add (res); return tasks.poll(); } ' (извините, что это мой первый раз, когда я использую переполнение стека xD) – Daniele