【问题标题】:JavaFX : Use a Thread more than onceJavaFX:多次使用线程
【发布时间】:2013-04-08 20:37:04
【问题描述】:

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

这是我的代码的总结:

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

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

但是,如果我再次单击,则不会添加任何内容。难道我做错了什么 ?我们不能多次使用一个线程吗?

【问题讨论】:

  • 不,您不能多次使用线程。

标签: java multithreading javafx-2 javafx


【解决方案1】:

来自Thread.start() 文档:

多次启动一个线程是不合法的。特别是,一个 线程一旦完成执行就可能不会重新启动。

来自Concurrency in JavaFX 教程:

Task 类定义了一个不能重复使用的一次性对象。如果你 需要一个可重用的 Worker 对象,使用 Service 类。

因此,您必须考虑 Service 类而不是 Task


编辑:这应该适合你:

服务 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();
    }
}

【讨论】:

  • 非常感谢您的帮助。我现在就找那个:)
  • 记得自己设置执行器并重用它,否则你仍然在各处创建新线程。
  • @AndyTill 你能提出更好的方法吗?
  • 通常会有很多服务类,重置它们仍然会为每个服务留下一个线程(执行程序)。通过调用 Service#setExecutor 并创建服务的新实例来重用 Executor 对象将允许您重用由该执行器创建的线程(如果已配置)。
【解决方案2】:

使用包装类来实现

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

【讨论】:

    【解决方案3】:

    用一个按钮可以触发新任务

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-07
      • 1970-01-01
      • 1970-01-01
      • 2019-03-18
      • 2018-12-18
      • 2015-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多