首页 > 其他分享 >如何正确在多线程环境下更新UI_使用Platform的runLater方法

如何正确在多线程环境下更新UI_使用Platform的runLater方法

时间:2023-06-01 18:24:30浏览次数:42  
标签:runLater updateProgress Platform UI import 线程 多线程

如何正确在多线程环境下更新UI_使用Platform的runLater方法

许多UI控件都提供了各种修改方法,比如我们可以修改 Label 上面的文本,进度条 ProgressBar 的进度。

但我们必须保证修改UI的线程是 JavaFX 的UI线程,如果不是则会出现异常。

那么我们如何在另一个线程中修改 JavaFX 的UI呢?方法是使用 Platform.runLater 。

效果展示

image

示例代码

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.ProgressBar;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class RunLaterExample extends Application
{
    private ProgressBar progressBar;

    private void updateProgress(String message, int percent)
    {
        System.out.println(message);
        Platform.runLater(() -> progressBar.setProgress(percent * 0.01) );
    }

    private static void sleepSecond(int second)
    {
        try
        {
            Thread.sleep(second * 1000);
        }
        catch (Exception e)
        {
        }
    }

    private void startInitThread()
    {
        new Thread(() -> {

            sleepSecond(2);
            this.updateProgress("Init step 1...", 30);
            
            sleepSecond(2);
            this.updateProgress("Init step 2...", 50);

            sleepSecond(2);
            this.updateProgress("Init step 3...", 70);
            
            sleepSecond(2);
            this.updateProgress("Init finish", 100);

        }).start();
    }

    @Override
    public void start(Stage window) throws Exception
    {
        startInitThread();

        VBox vBox = new VBox();

        progressBar = new ProgressBar(0);

        vBox.getChildren().add(progressBar);

        Scene scene = new Scene(vBox, 400, 300);

        window.setScene(scene);
        window.setTitle(this.getClass().getSimpleName());
        window.show();
    }

    public static void main(String[] args)
    {
        launch(args);
    }
}

代码说明

这段代码创建了一个 ProgressBar ,并在另一个线程中更新它。

程序启动后,调用 startInitThread 创建了一个新的线程,模拟程序初始化过程,并通过调用 updateProgress 来更新进度条。

我们使用 Platform.runLater(() -> progressBar.setProgress(percent * 0.01) ); 来确保修改进度条的操作在 JavaFX 的UI线程中。

总结

我们必须确保在 JavaFX UI 线程中修改 UI 。如果在另一个线程要这么做,就需要通过使用 Platform.runLater 方法将修改的操作提交过去。

标签:runLater,updateProgress,Platform,UI,import,线程,多线程
From: https://www.cnblogs.com/javafx-howto/p/17449845.html

相关文章

  • Java多线程三(线程池执行完后再执行主线程)CountDownLatch
      我们在开发多线程的时候,有两种情况一种是我们处理好后,不用管结果。比如我需要查询某些数据然后存在数据库里。还有一种就是查询好数据(通过线程池),然后导出数据。这个就比较麻烦。因为我们要将数据通过多线程处理后,返回一个统一的结果。(由于多线程是在不同的时候执行数据),假如执......
  • SpringBoot中定时任务多线程任务
    SpringBoot使用Spring自带的Schedule来实现定时任务变得非常简单和方便。在这里个大家分享下。开启缓存注解@SpringBootApplication@EnableScheduling//开启定时任务publicclassApplication{publicstaticvoidmain(String[]args){SpringApplicat......
  • 多线程
    多线程线程简介多任务程序:是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。进程:是执行程序的一次执行过程,它是一个动态的概念。是系统资源分配的单位。线程:进程中包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。线程是CPU调度和......
  • python selenium框架解决ip代理框不能自动化登录,解决pyautogui开不了多线程问题
    有时候我们使用python自动化框架的时候,打开一个网页的时候,它会出现出线这一种登录框,我们f12检查不了,用开发者工具强制检查里面没有任何属性.那这时候我们就可以用到python第三方库:pyautoguiPyAutoGUI:是一个Python库,可用于自动化GUI(图形用户界面)程序的任务。它可以让Pytho......
  • .net耗时:多线程分段并发执行与单线程异步执行
    多线程执行存在线程切换的耗时,可采用单线程异步执行。性能根据实际情况调优。结合上面两种情况:可实现多线程异步执行。目前先看看下面两个例子1 多线程分段执行设备查找耗时操作///<summary>///异步查询设备///</summary>///<paramna......
  • Spring Boot 定时任务单线程和多线程配置
    第一种:把参数配置到.properties文件中:代码:packagecom.accord.task;importjava.text.SimpleDateFormat;importjava.util.Date;importorg.springframework.scheduling.annotation.Scheduled;importorg.springframework.stereotype.Component;/***从配置文件加载......
  • python获取threading多线程的return返回值
    转载:(15条消息)python获取threading多线程的return返回值_pythonthreading返回值_星火燎愿的博客-CSDN博客我们正常使用threading模块创建的线程是无法获取它所执行方法的返回值的;如:w=threading.Thread(target=worker,args=(i,))一、重写线程,获取线程return返回值要想获......
  • 多线程-线程池与java内存模型
    多线程-线程池与java内存模型线程池的使用(思路:什么是线程池->他的基本构造以及参数含义->如何使用,使用过程中需要注意什么->有哪些好用的工具类)线程池的基笨概念:首先看一下的继承关系,其次看他的状态,它是利用int的高三位表示状态,比如111表示能接受任务,具体看下面第二章图......
  • JS大文件分片上传/多线程上传
    ​ 一、概述 所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载。在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了。一般断点下载时才用到Range和Content-Range实体头。HTTP协议本身不支持断点上传,需要自己实现。 二、Range  用于请求头......
  • redis是单线程还是多线程?为什么redis那么快?
    redis是单线程的。官方表示,Redis是基于内存操作,CPU不是Redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程来实现,就使用单线程了!Redis为什么单线程还这么快?1、误区1:高性能的服务器一定是多线程的?2、误区2:多线程一定比单线程效率高?多线程需要cpu调......