JAVA並行流的效能“陷阱”
阿新 • • 發佈:2019-01-07
從java8開始,並行程式設計變得很容易,通過並行流(parallelStream),可以很輕鬆的實現多執行緒並行處理。但是,這裡面有個性能“陷阱”,如果不注意,使用並行流的效果反而更差,這個陷阱是什麼呢?
這個陷阱就是,並行流預設都是用同一個預設的ForkJoinPool,這個ForkJoinPool的執行緒數和CPU的核心數相同。如果是計算密集型的操作,直接使用是沒有問題的,因為這個ForkJoinPool會將所有的CPU打滿,系統資源是沒有浪費的,但是,如果其中還有IO操作或等待操作,這個預設的ForkJoinPool只能消耗一部分CPU,而另外的並行流因為獲取不到該ForkJoinPool的使用權,效能將大大降低。可見,預設的ForkJoinPool**必須只能**處理計算密集型的任務。
那麼,對應非計算密集型的任務,改怎麼處理呢? 這就需要我們使用自己建立的ForkJoinPool來執行任務,下面給出例項程式碼:
ForkJoinPool forkJoinPool = new ForkJoinPool(8); forkJoinPool.submit(()->{ tasks.parallelStream().forEach(t->{ try { String gdsstatus=transactionService.GetTransInfo(url, t.getTask_id()); checkStatus(t.getTask_id(),t.getTask_status(),gdsstatus); } catch (Exception e) { System.out.println("EXCEPTION OCCOR IN TASK:"+t.getTask_id()); e.printStackTrace(); } System.out.println("NO:"+count.getAndIncrement()+" is done"); }); });