gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 13:07:49 24 4
gpt4 key购买 nike

我对Java多线程中的任务有点困惑。
即,我有15个对象,它们实现Callable,并且由ExecutorService提交。每个Callable都有其自己的进度条,并使用setProgress方法在for循环中进行更新。
我想显示15个可调用对象中的3个,这些可调用对象将通过获取其名称并将其设置为场景中的标签来完成其第一,第二和第三位置的工作。当然,每个可调用对象具有不同的工作时间。

我创建了Task,然后在新线程中启动它,并从ExecutorService遍历将来的任务列表。
问题在于,直到将来列表的第一个元素为true(直到第一个线程完成),我的标签才可见。我真的不知道为什么,我将非常感谢您的帮助。

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之后的某个时间。
这是我可调用对象中的调用方法:
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();
}

最佳答案

The problem is that my labels aren't visible until first element of the future list is true (until first thread is finished). I have really no idea why and i would be very grateful for your help.



根据 Future#get的文档

Waits if necessary for the computation to complete, and then retrieves its result.



这是您的代码-特别注意包含 future.get()的行:
public Void call() {
int i = 0;
while (i < 3) {
for (Future<Boolean> future : futures) {
try {
if (future.get() == true && i == 0) {

在循环的第一次迭代期间,从 futures检索第一个Future,然后 future.get()停止循环的执行并等待(保持)直到该第一个Future(第一个线程)的执行完成并返回结果。
然后循环继续,并调用 LabelX..setVisible(true);使标签可见。

关于java - 当将来列表中的第一个元素为true时,为什么要完成任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53964333/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com