並行執行(Callable和Future)一定比序列執行效率高嗎?
在一個程式裡順序呼叫了兩個不相關的方法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毫秒時,採用並行執行的優勢才顯露出來。