runlater hilos example concurrencia asynctask java multithreading javafx-2 javafx

hilos - javafx task



JavaFX: utilice un subproceso más de una vez (3)

De la documentación Thread.start () : No

Nunca es legal comenzar un hilo más de una vez. En particular, un hilo no puede reiniciarse una vez que se ha completado la ejecución.

Desde el tutorial de Concurrencia en JavaFX :

La clase Tarea define un objeto de una sola vez que no se puede reutilizar. Si necesita un objeto Worker reutilizable, use la clase de servicio.

Por lo tanto, debe considerar la clase de servicio en lugar de la tarea .

Editar : esto debería funcionar para usted:

Service<Void> service = new Service<>(task); @FXML protected void launch(ActionEvent event){ if (!service.isRunning()) { service.reset(); service.start(); } }

Soy nuevo con JavaFX y tengo un pequeño problema con un hilo: puedo ejecutarlo dos veces y no puedo encontrar el motivo.

Aquí hay un resumen de mi código:

Task<Void> task = new Task<Void>() { @Override public Void call() throws ImageLoadedException, HomographyException, IOException { try{ System.out.println("GO !"); return null; } catch (Exception e){ e.printStackTrace(); } return null; } @Override protected void succeeded() { super.succeeded(); System.out.println("SUCCEEDED"); } }; @FXML protected void launch(ActionEvent event){ new Thread(task).start(); }

Cuando hago clic por primera vez en el botón que inicia mi hilo, mi tarea se ejecuta sin ningún problema (en mi consola aparece "GO!" Y "SUCCEEDED").

Pero si hago clic una segunda vez, nada se agrega. Estoy haciendo algo mal ? ¿No podemos usar un hilo más de una vez?


Con un botón puede disparar nuevas tareas

Button btn = new Button(); btn.setText("New task"); btn.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { Executor ex=new Executor("Task"+count); ex.start(); count++; System.out.println("Task Starting..."); } });


Hazlo con una clase wraper

import java.io.IOException; import javafx.concurrent.Task; public class Executor { private String name; private Task<Void> task; public Executor(final String name) { this.name=name; task = new Task<Void>() { @Override public Void call() throws IOException, InterruptedException { try { int i=0; while(i<20){ System.out.println(name); Thread.sleep(2000); i++; } return null; } catch (IllegalThreadStateException e) { System.out.println(e); } return null; } @Override protected void succeeded() { super.succeeded(); try { System.out.println(name+" finish"); } catch (Exception ex) { System.out.println(ex); } } }; } public void start() { try { Thread th = new Thread(task); th.start(); } catch (Exception ex) { System.out.println(ex); } } }