在一个程序里顺序调用了两个不相关的方法A和B,A耗时100毫秒,B耗时80毫秒,所以总共耗时180毫秒。
main(){
methodA;
methodB;
}
因为方法A和B不相关,所以我们可以将程序改造成并行执行,使用Callable和Future配合实现(只讨论需要A和B的返回值的情况)。
main(){
ExecutorService executor = Executors.newFixedThreadPool(2);
Future<JSONObject> future1 = executor.submit(new Callable<JSONObject>() {
@Override
public JSONObject call() throws Exception {
return methodA;
}
});
Future<Integer> future2 = executor.submit(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
return methodB
}
});
executor.shutdown();
JSONObject r1 = future1.get();
int r2 = future2.get();
}
因为是并行执行,所以理论上,执行时间总共是100毫秒(取两个方法中耗时最大的)+异步线程自身的消耗时间
经过试验,异步线程自身的消耗时间大约是200毫秒,这样并行执行的总时间就是300毫秒,大于串行执行的180毫秒。
可见并行执行不一定比串行执行效率高。对于耗时很少的方法来说,选择顺序执行既简单又高效。
当至少有两个方法的耗时都超过200毫秒时,采用并行执行的优势才显露出来。