带有Task的Java多线程仅在onClick按钮上起作用一次

时间:2018-06-20 16:41:07

标签: java multithreading java-threads

随附的是以下代码段。我是多线程新手。尝试做多线程哪种工作。但是,第一次单击按钮后,第二次以后将不再“创建线程”并运行我的方法。

我也尝试过实现Runnable接口,但是它无法获取Anchorpane参考来加载小吃栏,因此我改用task方法。感谢您的帮助!

    @FXML
    private AnchorPane anchorPane;

    Thread thread;
    @FXML
    void onClickLoginButton(ActionEvent event) throws Exception {
            thread = new Thread(task);
            thread.start();
    }
    Task<Void> task = new Task<Void>() {
        @Override
        public Void call(){
            //System.out.println("Thread running"+thread.getId());
            try {
                credential = login.login();
            } catch (UnknownHostException u) {
                Platform.runLater(() -> {
                    System.out.println("No wifi");
                    JFXSnackbar snackbar = new JFXSnackbar(anchorPane);
                    snackbar.show("Please check your internet connection", 3000);
                    //u.printStackTrace();
                });
            } catch (Exception e) {
                //e.printStackTrace();
            }
            //System.out.println("Thread running"+thread.getId());
            return null;
        }
    };

1 个答案:

答案 0 :(得分:2)

此操作仅运行一次的原因与Task的总体工作方式有关

此处每个Task的文档:https://docs.oracle.com/javase/8/javafx/api/javafx/concurrent/Task.html

  

与FutureTask一样,Task是一键式类,不能重用。   有关可重复使用的工作人员,请参见服务。

因此,如果您想多次重复上述过程,那么使用Task并不是一个好的选择。在您想要实现类似目标的地方,检查为工人和服务推荐的替代方案。