如何每5秒增加一次int不会阻塞我的UI?

时间:2019-03-06 18:23:12

标签: java javafx javafx-8 javafx-2

我有一个数组String[] announcement = new String[20];,它具有20个值,我想每5秒检索一次。我找不到任何解决方法,每隔 5秒增加一次而不会阻塞我的UI。

2 个答案:

答案 0 :(得分:1)

您需要的是ThreadThread与您的程序一起运行,因此您可以在程序仍然运行而不会冻结的情况下运行冗长的任务(例如下载文件)。每五秒钟设置一个字符串值的程序示例(我认为这是您所做的解释):

import java.util.concurrent.TimeUnit;

class Main {
    public static void main(String[] args) {
            // Thread runs alongside program without freezing
            String[] retrievalArary = new String[20];
            Thread thread = new Thread(new Runnable() {
                public void run() {
                    for (int i = 0; i < retrievalArary.length; i++) { // Run for the same count as you have items in your array
                    try {
                        TimeUnit.SECONDS.sleep(5); // Sleeps the thread for five seconds
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                        retrievalArary[i] = Integer.toString(i); // Add the integer run count to the array
                        System.out.println(i); // Show progress
                    }

                }
            });
            thread.start();

    }
}

我无法确切地说出您要完成的工作,但是您可以很轻松地更改代码以符合您的要求。

答案 1 :(得分:1)

由于问题是用JavaFX标记的,因此我假设您要在检索到值后更新一些Node。如果使用常规线程实现,则必须使用Platform.runLater包装代码。但是,如果您使用javafx.animation.Timeline,则无需执行额外的工作。

String[] announcement = new String[20];

AtomicInteger index = new AtomicInteger();

Timeline timeline= new Timeline(new KeyFrame(Duration.seconds(5), e->{
   String msg = announcement[index.getAndIncrement()];
   // Use this value to do some stuff on Nodes.
});
timeline.setCycleCount(announcement.length);
timeline.play();