在JavaFX中,要实现点击按钮启动多个周期性任务并通过多线程执行,并在任务结束后将结果写入多个文本组件中,同时提供另一个按钮来停止这些任务,你可以使用ScheduledExecutorService
来管理周期性任务,并使用AtomicBoolean
来控制任务的执行与停止。
以下是一个简化的示例,展示了如何实现这一功能:
- 设置JavaFX界面:包括两个按钮(一个启动,一个停止)和多个文本区域(用于显示结果)。
- 创建周期性任务:这些任务将周期性地执行,并在完成时更新UI。
- 管理线程:使用
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()
尝试停止所有任务,但已经启动但尚未完成的任务可能不会被立即停止。如果需要更严格的停止机制,你可能需要在任务内部实现更复杂的逻辑来检查是否应该停止执行。