【问题标题】:JavaFX pausing during for loop WITHOUT using Thread.Sleep()JavaFX 在 for 循环期间暂停而不使用 Thread.Sleep()
【发布时间】:2014-05-28 19:40:23
【问题描述】:

我正在使用 FXMLController 和场景构建器在 JavaFX 中对此进行编码。 我目前正在创建一个 Instagram“喜欢者”,主要是为了练习,因为我是计算机科学专业的,我只是喜欢编码。

我的问题是,我有一个 for 循环,可以为每个主题标签“点赞”20 张照片,我显然需要延迟,否则我很快就会被禁止。用户可以选择延迟,然后我将这个延迟随机化,这样就不会太机械化了。

我能够使用此延迟的唯一方法是通过 thread.sleep 方法,但由于我在 FXMLController 上进行编码,它会冻结整个 UI,并以某种方式阻止其他文本区域被更新。这显然不理想。

我到处寻找替代方法,但找不到任何适用于我的程序的方法。

我会给出整个方法:

    private void start() {
    sleepWhen();
    tagNumber++;
    int delays = Integer.valueOf(delay.getText());
    delays = delays * 1000;
    if (loaded) {
        runTime.clear();
        runTime.appendText("Liking...");
        for (int i = 0; i < 20; i++) {
            webEngine.executeScript("document.getElementsByClassName('btn btn-default btn-xs likeButton')[" + i + "].click()");
            try {
                double random = Math.random() * 1000;
                random = random + delays;
                delays = (int) random;
                System.out.println(delays);
                likes++;
                likesNumber.clear();
                likesNumber.appendText(String.valueOf(likes));
                System.out.println(String.valueOf(likes));
                Thread.sleep(delays);
                delays = Integer.valueOf(delay.getText());
                delays = delays * 1000;

            } catch (InterruptedException ex) {
                //do nothing
            }

            System.out.println("tag number" + tagNumber + "numbertags" + numberTags);
            if (!sleep) {
                if (tagNumber < numberTags) {
                    System.out.println("Loading tag:" + tagNumber);
                    loadTag(tagNumber);
                }
            }
        }
    }
}

这喜欢 20 张照片,然后加载另一个主题标签,然后重复。

对此的任何帮助都会很棒,谢谢。

【问题讨论】:

    标签: java for-loop javafx fxml thread-sleep


    【解决方案1】:

    冻结是因为你试图在同一个线程上做所有事情,当你使用Thread.sleep(delays)时,你实际上是让你的 UI 线程进入睡眠状态,因此会出现延迟!

    尝试为你的工作使用不同的线程,你可以使用工作线程,如果你正在做的任何事情都不会影响 UI

    如果您想在 UI 上显示更改,也可以使用 Platform.runLater()

    更多详情:

    1. concurrency in javafx !

    2. Platform.runLater and Task in JavaFX

    【讨论】:

    • 谢谢!与 Platform.Runlater 配对的任务效果很好。
    猜你喜欢
    • 2014-04-05
    • 2018-03-24
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2020-04-15
    相关资源
    最近更新 更多