我正在尝试使用线程进行多次繁重的计算。 然后,我需要在确保所有线程完成其工作后对结果做一些事情。
以下是基本代码:
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”,似乎根本没有处理计算。
由于
答案 0 :(得分:1)
您可以使用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";
}