当前位置: 首页 > news >正文

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

说明

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

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

http://www.lryc.cn/news/414599.html

相关文章:

  • 使用RabbitMQ实现异步支付状态通知
  • [最短路dijkstra],启动!!!
  • Java企业微信服务商代开发获取AccessToken示例
  • How does age change how you learn?(2)年龄如何影响学习能力?(二)
  • 可验证随机函数 vrf 概述
  • 鸿蒙双向绑定组件:TextArea、TextInput、Search、Checkbox,文本输入组件,图案解锁组件PatternLock
  • JS 算法 - 计数器
  • JavaScript基础——JavaScript运算符
  • E23.【C语言】练习:不创建第三个变量实现两个整数的交换
  • 如何搭建一个web系统?
  • 三十种未授权访问漏洞复现 合集( 二 )
  • C语言学习笔记[29]:函数①
  • 使用Springboot + netty 打造聊天服务之Nacos集群问题记录
  • 全网唯一!R语言顶刊配色包TheBestColors
  • 链表题型思路错误总结
  • 算法学习day28
  • C语言基础题:迷宫寻路(C语言版)
  • 力扣-1两数之和2两数相加-2024/8/3
  • 简站WordPress主题 专业的WordPress建站服务商
  • Final Shell for Mac 虚拟机连接工具【简单易操作,轻松上手】【开发所需连接工具】
  • Oracle JDK:版本、支持与许可
  • 大模型学习笔记 - LLM 之RLHF人类对齐的简单总结
  • 【从零开始一步步学习VSOA开发】 概述
  • 小程序背景图片无法通过 WXSS 获取
  • CC++内存魔术:掌控无形资源
  • 算法--初阶
  • 通过Java实现插入排序(直接插入,希尔)与选择排序(直接选择,堆排)
  • 大型分布式B2B2C多用户商城7.0企业版源码分享【java语言、方便二次开发】
  • C++的结构体、联合体、枚举类型(一)
  • 搭建高可用OpenStack(Queen版)集群(一)之架构环境准备