1. 程式人生 > >Java8 並行流多執行緒操作

Java8 並行流多執行緒操作

並行流是一個把內容分成多個數據塊的,並用不同的執行緒分別處理每個資料塊的流。下面通過簡單的示例介紹一下順序流和並行流的特點。後面後時間在詳細記錄。

並行流:

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        for(int i =0;i<10;i++){
            list.add(String.valueOf(i));
        }
        list.parallelStream().forEach(l ->{
            try {
                Thread.sleep(1000);
                System.out.println(l+"     "+DateUtil.now());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
    }

輸出結果:

8     2018-11-12 16:51:43
4     2018-11-12 16:51:43
0     2018-11-12 16:51:43
1     2018-11-12 16:51:43
6     2018-11-12 16:51:43
9     2018-11-12 16:51:43
7     2018-11-12 16:51:43
2     2018-11-12 16:51:43
5     2018-11-12 16:51:44
3     2018-11-12 16:51:44

順序流:

public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        for(int i =0;i<10;i++){
            list.add(String.valueOf(i));
        }
        list.stream().forEach(l ->{
            try {
                Thread.sleep(1000);
                System.out.println(l+"     "+DateUtil.now());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
    }

輸出介面:

在這裡插入程式碼片
0     2018-11-12 16:52:36
1     2018-11-12 16:52:37
2     2018-11-12 16:52:38
3     2018-11-12 16:52:39
4     2018-11-12 16:52:40
5     2018-11-12 16:52:41
6     2018-11-12 16:52:42
7     2018-11-12 16:52:43
8     2018-11-12 16:52:44
9     2018-11-12 16:52:45

分析:

可以看到並行流和順序流的區別只是parallelStream和stream的區別,並行流的執行緒數預設取決於處理器的數量,這個值是有Runtime.getRuntime().available-Processors()得到的,可以修改(不推薦),他的原理是通過java7開始有的分支/並行框架(fock/join)就是講一個大的任務不斷的遞迴拆分知道可以執行。當然並行流也不可以亂用,否則效率可能還不如順序流。