JavaFX:多次使用线程

我是JavaFX的新手,我对一个线程有点问题:我可以执行两次而且找不到原因。

以下是我的代码的总结:

Task task = new Task() { @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(); } 

当我第一次点击启动我的线程的按钮时,我的任务运行没有任何问题(我的控制台显示“GO!”和“SUCCEEDED”)。

但如果我第二次点击,没有任何附加信息。 难道我做错了什么 ? 我们不能多次使用一个线程吗?

从Thread.start()文档: 没有

不止一次启动线程永远不合法。 特别是,一旦完成执行,线程可能无法重新启动。

来自JavaFX教程中的Concurrency :

Task类定义了一个无法重用的一次性对象。 如果需要可重用的Worker对象,请使用Service类。

因此,您必须考虑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(); } } 

使用按钮可以启动新任务

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

用一个包装类来做

  import java.io.IOException; import javafx.concurrent.Task; public class Executor { private String name; private Task task; public Executor(final String name) { this.name=name; task = new Task() { @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); } } }