gpt4 book ai didi

java - 在java中如何从线程中获取返回值?

转载 作者:行者123 更新时间:2023-12-01 18:44:46 28 4
gpt4 key购买 nike

以下代码可以编译,但在运行时会导致空指针异常。我最好的猜测是,outputInts 对每个线程都不是“可见”的,因此无法写入。

public class myClass{

ArrayList<int> outputints

public void foo(int start, int end) {
for (int i = start; i <= end; i++) {
bar(i);
}

private void bar(int i) {
class OneShotTask implements Runnable {
int i;
OneShotTask(int j) {
i = j;
}
@Override
public void run() {
try {
System.out.println(i);
outputints.add(i); //null pointer exception caused here
}
} catch (Exception e) {
System.out.println(e.toString());
}

}
}
Thread t = new Thread(new OneShotTask(j));
t.start();
}

}

我读到我应该使用可调用来实现此目的,但我不明白这是如何实现的。还有像java Runnable run() method returning a value这样的例子似乎建议我可以使用可调用函数来运行少量线程,而我可能需要一千个线程的区域中的某个地方。

我正在寻求帮助以使上述实现正常工作,或者寻求外行术语指南以了解如何使用可调用来实现它

最佳答案

Brian Goetz 写了一本很棒的书,名为《Java 并发实践》,深入探讨了这一点。您应该考虑使用完成服务,它是执行器的一种。下面是 Java 代码示例:

     void solve(Executor e, Collection<Callable<Result>> solvers)
throws InterruptedException, ExecutionException {
CompletionService<Result> ecs = new ExecutorCompletionService<Result>(e);
for (Callable<Result> s : solvers)
ecs.submit(s);
int n = solvers.size();
for (int i = 0; i < n; ++i) {
Result r = ecs.take().get();
if (r != null)
use(r);
}
}

您可以使用 take() 方法从 ExecutorCompletionService 检索已完成的 Future。在 FutureTask 上调用 get() 方法来获取结果。这些类可以使用泛型进行参数化,以实现类型安全和更大的代码灵 active 。

关于java - 在java中如何从线程中获取返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18263175/

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