我遇到了以下问题:出于性能原因,我需要将工作拆分到多个线程,但我不确定要采取什么方法。
首先,我将提供的任务应该返回一个值并接受一个参数。此外,main 方法(做主要工作,不是static main()
)已经在单独的线程上运行,并且会定期调用。此外,此方法必须在某个时候等待所有线程完成然后继续。
一种方法(对我来说最明显)是将每个作业安排在单独的线程上并将结果存储在类变量中:
public Object result1, result2;
public void mainMethod() throws InterruptedException {
final Thread thread = new Thread(new Runnable() {
@Override
public void run() {
result1 = expensiveMethod("param1");
}
});
final Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
result2 = expensiveMethod("param2");
}
});
thread1.join();
thread.join();
//Do rest of work
}
private Object expensiveMethod(Object param){
// Do work and return result
}
这有点丑陋且不理想,因为正如我所说,mainMethod 被多次调用,并且我不希望在设置结果变量时出现任何竞争条件。理想情况下,我想让它们成为局部变量,但我不能让它们从 run 方法中访问,除非它们是最终的,然后我不能给它们赋值......
我想做的另一种方法是:
public void mainMethod() throws InterruptedException, ExecutionException {
String obj1, obj2;
final ExecutorService executorService = Executors.newFixedThreadPool(16);
final Future<String> res1 = executorService.submit(new Callable<String>() {
@Override
public String call() throws Exception {
return expensiveMethod("param1");
}
});
final Future<String> res2 = executorService.submit(new Callable<String>() {
@Override
public String call() throws Exception {
return expensiveMethod("param2");
}
});
obj1 = res1.get();
obj2 = res2.get();
}
private String expensiveMethod(String param) {
// Do work and return result
}
这会自动等待来自 main 方法的这两个计算,并允许我将结果存储在本地。你们怎么看?还有其他方法吗?