1. 程式人生 > >並行執行(Callable和Future)一定比序列執行效率高嗎?

並行執行(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毫秒時,採用並行執行的優勢才顯露出來。