JavaFX : Use a Thread more than once JavaFX : Use a Thread more than once multithreading multithreading

JavaFX : Use a Thread more than once


From the Thread.start() documentation : No

It is never legal to start a thread more than once. In particular, a thread may not be restarted once it has completed execution.

From the Concurrency in JavaFX tutorial :

The Task class defines a one-time object that cannot be reused. If you need a reusable Worker object, use the Service class.

So, you have to consider the Service class rather than Task.


Edit: this should work for you:

Service service = new Service<>(task);

//Updated use this to create a new Service object instead    Service service = new Service() {    @Override    protected Task createTask() {        return new Task() {            @Override            protected Void call() throws Exception {                //Your codes here                return null;            }        };    }};@FXML protected void launch(ActionEvent event){     if (!service.isRunning()) {        service.reset();        service.start();    }}


With a button can fire new tasks

                    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...");                        }                    });


Do it with a wraper class

            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);                            }                }            }