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