son saber resueltos que otro hilos hacer esta espere ejemplos ejecutando detener despertar como java multithreading javafx

saber - join hilos en java



Hacer que el hilo de la aplicaciĆ³n JavaFX espere a que termine otro subproceso (2)

Estoy llamando a un método dentro de mi hilo de interfaz de usuario. Dentro de este método, se crea un nuevo hilo. Necesito que el hilo de la interfaz de usuario espere hasta que este nuevo hilo termine porque necesito los resultados de este hilo para continuar el método en el hilo de la interfaz de usuario. Pero no quiero tener la IU congelada mientras espera. ¿Hay alguna forma de hacer que el hilo de la interfaz de usuario espere sin esperar?


Nunca debe esperar a que el subproceso de la aplicación FX espere; congelará la IU y la dejará sin respuesta, tanto en términos de procesamiento de la acción del usuario como en términos de representar algo en la pantalla física.

Si está buscando actualizar la interfaz de usuario cuando se ha completado el proceso de larga ejecución, use la API javafx.concurrent.Task . P.ej

someButton.setOnAction( event -> { Task<SomeKindOfResult> task = new Task<SomeKindOfResult>() { @Override public SomeKindOfResult call() { // process long-running computation, data retrieval, etc... SomeKindOfResult result = ... ; // result of computation return result ; } } task.setOnSucceeded(e -> { SomeKindOfResult result = task.getValue(); // update UI with result }); new Thread(task).start(); });

Obviamente, reemplace SomeKindOfResult con cualquier tipo de datos que represente el resultado de su proceso de larga ejecución.

Tenga en cuenta que el código en el bloque onSucceeded :

  1. se ejecuta necesariamente una vez que la tarea ha terminado
  2. tiene acceso al resultado de la ejecución de la tarea de fondo, a través de task.getValue()
  3. está esencialmente en el mismo ámbito que el lugar donde lanzó la tarea, por lo que tiene acceso a todos los elementos de la interfaz de usuario, etc.

Por lo tanto, esta solución puede hacer cualquier cosa que pueda hacer "esperando a que la tarea termine", pero no bloquea el hilo de la IU mientras tanto.


Simplemente llame a un método que notifique a la GUI cuando finalice el subproceso. Algo como esto:

class GUI{ public void buttonPressed(){ new MyThread().start(); } public void notifyGui(){ //thread has finished! //update the GUI on the Application Thread Platform.runLater(updateGuiRunnable) } class MyThread extends Thread{ public void run(){ //long-running task notifyGui(); } } }