JavaFx中通过线程池运行或者停止多个周期性任务
创始人
2024-11-10 09:05:19
0次

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

说明

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

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

相关内容

热门资讯

每日必看!江岸多玩到底能开挂吗... 每日必看!江岸多玩到底能开挂吗(辅助挂),江岸多玩原来真的有辅助挂讲义1、江岸多玩脚本辅助下载、江岸...
玩家交流!颖河竞技怎么开挂(外... 玩家交流!颖河竞技怎么开挂(外挂),颖河竞技好像是有外挂教材一、颖河竞技游戏安装教程牌型概率发牌机制...
最新通报!皮皮四川麻将软件下载... 最新通报!皮皮四川麻将软件下载(辅助挂),皮皮四川麻将果然有辅助挂模块1、操作简单,无需皮皮四川麻将...
一分钟揭秘!52游戏开挂脚本(... 一分钟揭秘!52游戏开挂脚本(透视挂),52游戏切实有透视挂法子52游戏脚本下载中分为三种模型:52...
一分钟快速了解!堆堆乐开挂破解... 一分钟快速了解!堆堆乐开挂破解(外挂),堆堆乐竟然真的有外挂方针1、下载好堆堆乐正确养号方法之后点击...
重大通报!汇城贵州麻将开挂脚本... 重大通报!汇城贵州麻将开挂脚本(开挂),汇城贵州麻将原来真的有开挂法门1、重大通报!汇城贵州麻将开挂...
盘点一款!七色城透视挂件(外挂... 盘点一款!七色城透视挂件(外挂),七色城切实是真的有外挂经验1、全新机制【七色城ai辅助工具激活码】...
今日头条!多多休闲透视软件下载... 今日头条!多多休闲透视软件下载(外挂),多多休闲确实是真的有外挂攻略1、首先打开多多休闲辅助器下载最...
关于!钱柜麻将真的有透视吗(辅... 关于!钱柜麻将真的有透视吗(辅助器),钱柜麻将一贯是有辅助器练习钱柜麻将能透视中分为三种模型:钱柜麻...
今日焦点!河北家乡棋牌辅助工具... 今日焦点!河北家乡棋牌辅助工具(外挂),河北家乡棋牌果然是有外挂手册小薇(辅助器软件下载)致您一封信...