1. 程式人生 > >JAVA並行流的效能“陷阱”

JAVA並行流的效能“陷阱”

從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");

        });
    });