当前位置: 首页 > 知识库问答 >
问题:

当未来列表中的第一个元素为true时,为什么要完成任务?

柳飞飙
2023-03-14
public void startButtonClicked() {
    Task task = new Task<Void>() {
        @Override
        public Void call() {
            int i = 0;
            while (i < 3) {
                for (Future<Boolean> future : futures) {
                    try {
                        if (future.get() == true && i == 0) {
                            labelFirst.setVisible(true);
                            i++;
                        }

                        if (future.get() == true && i == 1) {
                            labelSecond.setVisible(true);
                            i++;
                        }

                        if (future.get() == true && i == 2) {
                            labelThird.setVisible(true);
                            i++;
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (ExecutionException e) {
                        e.printStackTrace();
                    }
                }
            }

            return null;
        }
    };

    for (Callable c : callables) {
        futures.add(executorService.submit(c));
    }
    new Thread(task).start();

    executorService.shutdown();
}

在我的理想解决方案中,每个标签将在其可调用完成时变得可见,因此labelSecond应该在LabelFirst之后出现一段时间。它是我的Callable:

public Boolean call() {
    double raceTime = ThreadLocalRandom.current().nextDouble(45.0, 60.0);

    try {
        for (double i = 0; i < raceTime; i += 0.01) {
            TimeUnit.MILLISECONDS.sleep(1);
            progressBar.setProgress(i / raceTime);
        }
    } catch (ParseException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    return true;
}

编辑:通过检查Future.isDone()和很少的更改,它可以像我希望的那样工作。

public void startButtonClicked() {
        Task task = new Task<Void>() {
            @Override
            public Void call() {
                int i = 0;
                while (i < 3) {
                    i = 0;
                    for (Future<Boolean> future : futures) {
                        if (future.isDone() == true) i++;

                        if (i == 1) {
                            labelFirst.setVisible(true);
                            labelFirstCyclistName.setVisible(true);
                        }

                        if (i == 2) {
                            labelSecond.setVisible(true);
                            labelSecondCyclistName.setVisible(true);
                        }

                        if (i == 3) {
                            labelThird.setVisible(true);
                            labelThirdCyclistName.setVisible(true);
                        }
                    }
                }

                return null;
            }
        };

        for (Cyclist c : cyclists) {
            futures.add(executorService.submit(c));
        }
        new Thread(task).start();

        executorService.shutdown();
    }

共有1个答案

王刚毅
2023-03-14

问题是,在future列表的第一个元素为true之前(在第一个线程完成之前),我的标签是不可见的。我真的不知道为什么,我会非常感谢你的帮助。

根据Future#Get的文档

如果需要,等待计算完成,然后检索其结果。

public Void call() {
    int i = 0;
    while (i < 3) {
            for (Future<Boolean> future : futures) {
                try {
                    if (future.get() == true && i == 0) {
 类似资料:
  • 我正在编写一个函数,该函数应该删除链表的最后一个元素 这是我对节点的定义 我有一个节点列表1,它为值1、2、3运行了3次insert函数 insert函数如下所示 现在我的delete_last_element函数如下所示 基本上,我的想法是,我会先看看第一个元素是否为空,如果是,我什么也不做,因为没有最后一个元素。然后我将curr设置为head->next以查看列表中的下一个元素,如果它为nul

  • 我有一个实例列表。 如何将他们转变成这样一个未来:

  • 问题内容: 我是AngularJS的初学者,目前我正在Django中开发一个Web应用程序,在该应用程序中我可以使用AngularJS作为前端部分。我的问题是,用作用域中的对象填充的下拉列表始终以空白元素开头(如果我从列表中选择一个,该问题就不存在了)。这会产生问题,因为如果用户不选择任何内容,那么POST请求通常将不再起作用。我想知道如何拥有类似预选值或类似的东西。这是我的代码的一部分: 选择标

  • 我有一个标准脚本,可以抓取页面,启动与数据库的连接,并将数据库写入其中。我需要它在x小时后定期执行。我可以使用bash脚本和伪代码来做到这一点: 根据我对消息代理的了解,它们用于将“信号”从一个正在运行的程序发送到另一个程序,原则上就像HTTP一样。就像我有一段接受用户电子邮件ID的代码一样,它将带有email-id的信号发送到另一段将发送电子邮件的代码。 我需要芹菜来运行heroku的定期任务。

  • 问题内容: 我最近与一位同事讨论了Java为什么List接口没有and 方法的原因。 为了实现这样的功能,必须编写一个看起来像这样的包装器: 我不知道所有List的实现,但我假设至少在LinkedList和ArrayList中, 获取最后一个元素和第一个元素 (恒定时间)应该是很简单的。 所以问题是: 是否有一个特定的原因为什么不能为任何List实现提供tail方法? 问题答案: Java Col

  • 我希望表的所有都具有,其被的重写。 结果应该变成: 我可以通过单独的查询获得它,例如: 第二个查询的结果应该合并到第一个查询中,这样:“当第二个表中的boolean为TRUE时,用第一个表覆盖第二个表的结果” role_cap和enduser_cap表中的正确值都应该成为结果的一部分。但是,如果对于相同的user_cap_id,role_cap有FALSE条目,而enduser_cap有TRUE条