一點一點看JDK源碼(五)java.util.ArrayList 後篇之Spliterator多線程遍歷html
liuyuhang原創,未經容許禁止轉載java
本文舉例使用的是JDK8的API數組
Spliterator爲jdk1.8新增接口,由ArrayList.spliterator();得到其返回值對象Spliterator。多線程
該對象可使用trySplit進行迭代器拆分,每次拆分後的迭代器接近上一次的二分之一。ide
這是官方對於大數據量數組多線程遍歷加工的一種趨勢性指引。post
首先須要定義一個線程,大數據
而後須要將拆分後的迭代器傳入該線程。this
執行start()方法讓實現的run()方法進入就緒狀態等待調用url
自定義線程代碼以下:spa
1 package com.FM.ArrayListStudy; 2 3 import java.util.Spliterator; 4 import java.util.function.Consumer; 5 6 /** 7 * 內部類,線程調用 8 */ 9 public class MyThread4Spliterator<T> extends Thread { 10 // 寄存變量 11 private Spliterator<T> list; 12 13 // 構造 - 傳遞參數 14 public MyThread4Spliterator(Spliterator<T> list) { 15 setList(list); 16 } 17 18 // 線程調用run 19 @Override 20 public void run() { 21 Spliterator<T> list2 = getList(); 22 list2.forEachRemaining(new Consumer<T>() { 23 24 @Override 25 public void accept(T t) { 26 System.out.println(Thread.currentThread().getName()+" === "+t); 27 } 28 29 }); 30 } 31 32 public Spliterator<T> getList() { 33 return list; 34 } 35 36 public void setList(Spliterator<T> list) { 37 this.list = list; 38 } 39 }
定義並拆分迭代器代碼以下,須要注意拆分規則
1 package com.FM.ArrayListStudy; 2 3 import java.util.ArrayList; 4 import java.util.Spliterator; 5 6 public class SpliteratorInArrayListStudy { 7 public static void main(String[] args) { 8 // 初始化list 9 ArrayList<Integer> list = new ArrayList<Integer>(); 10 for (int i = 0; i < 20; i++) { 11 list.add(i + 1); 12 } 13 //四線程均分配比方式 14 Spliterator<Integer> spliterator01 = list.spliterator(); //01中有20個元素 15 Spliterator<Integer> spliterator02 = spliterator01.trySplit(); //01中有10個元素,02中有10個元素 16 Spliterator<Integer> spliterator03 = spliterator01.trySplit(); //01中有5個元素,02中有10個元素,03中有5個元素 17 Spliterator<Integer> spliterator04 = spliterator02.trySplit(); //01中有5個元素,02中有5個元素,03中有5個元素,04中有5個元素 18 MyThread4Spliterator<Integer> t01 = new MyThread4Spliterator<Integer>(spliterator01); 19 MyThread4Spliterator<Integer> t02 = new MyThread4Spliterator<Integer>(spliterator02); 20 MyThread4Spliterator<Integer> t03 = new MyThread4Spliterator<Integer>(spliterator03); 21 MyThread4Spliterator<Integer> t04 = new MyThread4Spliterator<Integer>(spliterator04); 22 t01.setName("001"); 23 t02.setName("002"); 24 t03.setName("003"); 25 t04.setName("004"); 26 27 t01.start(); 28 t02.start(); 29 t03.start(); 30 t04.start(); 31 } 32 }
運行結果:
以上!!