当前位置:   article > 正文

JavaFx中通过线程池运行或者停止多个周期性任务

JavaFx中通过线程池运行或者停止多个周期性任务

JavaFX中,要实现点击按钮启动多个周期性任务并通过多线程执行,并在任务结束后将结果写入多个文本组件中,同时提供另一个按钮来停止这些任务,你可以使用ScheduledExecutorService来管理周期性任务,并使用AtomicBoolean来控制任务的执行与停止。

以下是一个简化的示例,展示了如何实现这一功能:

  1. 设置JavaFX界面:包括两个按钮(一个启动,一个停止)和多个文本区域(用于显示结果)。
  2. 创建周期性任务:这些任务将周期性地执行,并在完成时更新UI。
  3. 管理线程:使用ScheduledExecutorService来调度任务,并使用AtomicBoolean来安全地控制任务的执行。

示例代码

import javafx.application.Application;
import javafx.application.Platform;
import javafx.concurrent.Task;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;

public class TaskSchedulerExample extends Application {

    private ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
    private AtomicBoolean running = new AtomicBoolean(false);

    @Override
    public void start(Stage primaryStage) {
        TextArea textArea1 = new TextArea();
        TextArea textArea2 = new TextArea();

        Button startButton = new Button("Start Tasks");
        startButton.setOnAction(e -> {
            running.set(true);
            scheduleTask(() -> updateTextArea(textArea1, "Task 1 result: " + System.currentTimeMillis()), 1, TimeUnit.SECONDS);
            scheduleTask(() -> updateTextArea(textArea2, "Task 2 result: " + System.currentTimeMillis()), 2, TimeUnit.SECONDS);
        });

        Button stopButton = new Button("Stop Tasks");
        stopButton.setOnAction(e -> running.set(false));

        VBox root = new VBox(10, startButton, stopButton, textArea1, textArea2);
        Scene scene = new Scene(root, 300, 200);

        primaryStage.setTitle("Task Scheduler Example");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private void scheduleTask(Runnable task, long period, TimeUnit timeUnit) {
        scheduler.scheduleAtFixedRate(() -> {
            if (running.get()) {
                task.run();
            } else {
                // 停止调度
                scheduler.shutdownNow();
            }
        }, 0, period, timeUnit);
    }

    private void updateTextArea(TextArea textArea, String text) {
        Platform.runLater(() -> {
            textArea.appendText(text + "\n");
        });
    }

    public static void main(String[] args) {
        launch(args);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63

说明

  • UI组件TextArea用于显示任务结果,Button用于控制任务的启动和停止。
  • 任务调度:使用ScheduledExecutorServicescheduleAtFixedRate方法来周期性地执行任务。
  • 任务停止:通过AtomicBooleanget方法检查是否应该继续执行任务。如果runningfalse,则调用scheduler.shutdownNow()来尝试停止所有正在执行的任务。
  • UI更新:由于JavaFX的UI更新必须在JavaFX应用线程上执行,因此使用Platform.runLater来更新TextArea

请注意,这个示例中的shutdownNow()尝试停止所有任务,但已经启动但尚未完成的任务可能不会被立即停止。如果需要更严格的停止机制,你可能需要在任务内部实现更复杂的逻辑来检查是否应该停止执行。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/934130
推荐阅读
相关标签
  

闽ICP备14008679号