gpt4 book ai didi

java - 多线程加入并获取返回值

转载 作者:行者123 更新时间:2023-12-01 10:57:30 25 4
gpt4 key购买 nike

我正在尝试使用线程进行多个繁重的计算。然后,在确保所有线程都完成其工作后,我需要对结果执行一些操作。

这是基本代码:

    private class Runner implements Runnable {
private String _result = "fail";

public String get_results() {
return _result;
}

public void run() {
_result = "do complex calculation";
}
}

public void test() {
List<Thread> threads = new ArrayList<Thread>();
List<Runner> threadObjects = new ArrayList<Runner>();

for (int i = 0; i < 10; i++) {
Runner runner = new Runner();
Thread t = new Thread(runner);
t.start();
threads.add(t);
threadObjects.add(runner);
}

for (Thread thread : threads) {
try {
thread.join();
} catch (InterruptedException ex) {
}
}

for (Runner threadObject : threadObjects) {
System.out.println(threadObject.get_results());
}

}

我的问题是,上面的代码片段是获取计算值的常见方法还是好的方法?如果没有请推荐更好的。另外有时我得到 runner.get_results() reponse = "fail",看起来计算根本没有处理。

谢谢

最佳答案

您可以使用 ExecutorService例如ScheduledThreadPoolExecutor ;

 ExecutorService executor = new ScheduledThreadPoolExecutor(numOfThreads); 

numOfThreads是您希望位于线程池中的线程数。

然后您可以使用 submit(Callable<T> task) ScheduledThreadPoolExecutor提供的方法执行计算的类。

然后您将得到 Callable执行您的计算并将其传递给 submit() ExecutorService中的方法执行计算;

class Calculation implements Callable {

@Override
public Object call() throws Exception { // The signature can be changed to return a different type (explained at the end)
return "do complex calculation";
}
}

submit(Callable<T> task) 的方法签名可以看出方法它返回 Future .

public <T> Future<T> submit(Callable<T> task)

get() Future的方法成功完成后,类将返回结果。这将确保您的计算在阅读之前完成。

关于 call() 返回类型的进一步说明方法;

尽管这会返回 Object没有什么可以阻止您更改它返回的对象的类型(这称为 co-variant returns )

例如以下内容是完全合法的:

  @Override
public String call() throws Exception {
return "do complex calculation";
}

关于java - 多线程加入并获取返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33549962/

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