将JavaFX任务的多个实例提交给执行者

时间:2018-10-18 08:30:24

标签: java javafx concurrency

我有一个task,在其中按下开始按钮后,需要在x个后台线程上运行y次。

我需要能够通过单击“取消”按钮来取消所有线程,或者让线程运行直到它们全部完成,然后以编程方式提交“取消”按钮。

我还需要能够从任务中返回一个字符串,以便更新TableView

我将如何使用执行程序服务来实现此目的,以便我可以提交x定义的多个线程,并能够按一下“停止”按钮来取消当前正在运行的所有线程,但仍然允许再次按下“开始”按钮?

过去我做过:

开始按钮:

 public void handleStartButton(ActionEvent event) {
        if(task != null) {
            System.out.println("Task already running");
            return;
        }
        task = new Task<Void>() {
            @Override
            protected Void call() {
                new LongTask().start(this, "Data to use");
                //fire cancel button here..
                return null;
            }
        };
        Thread thread = new Thread(task);
        thread.setDaemon(true);
        thread.start();
    }

取消按钮:

public void handleStopButton(ActionEvent event) {
            if(task == null) {
                System.out.println("Task not running");
                return;
            }
            System.out.println("Stop Pressed");
            task.cancel();
            task = null;
      }

任务要运行多次:

public class LongTask {
    public void start(Task<Void> task, String Data) {
        while (!task.isCancelled()) {
            System.out.println("Running test");
            try {
                Thread.sleep(5000);
                System.out.println(Data);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println("Test run ended");
        }
        System.out.println("Canceling...");
        System.out.println("Stop Pressed");
        return;
    }
}

0 个答案:

没有答案