Java8 並行流多執行緒操作
阿新 • • 發佈:2018-12-06
並行流是一個把內容分成多個數據塊的,並用不同的執行緒分別處理每個資料塊的流。下面通過簡單的示例介紹一下順序流和並行流的特點。後面後時間在詳細記錄。
並行流:
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)就是講一個大的任務不斷的遞迴拆分知道可以執行。當然並行流也不可以亂用,否則效率可能還不如順序流。