日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

今天读了JDK1.8源码,知道了并行迭代器Spliterator

發布時間:2023/12/10 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 今天读了JDK1.8源码,知道了并行迭代器Spliterator 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在JDK1.8的ArrayList里面偶然看到了這個內部類,同時對比了1.7的版本,發現1.7并沒有這后面的東西, 隨著好奇心,就搜了一下下,發現很有意思~? 也查了一些資料,如下總結:

Spliterator是什么

  Spliterator是一個可分割迭代器(splitable iterator),可以和iterator順序遍歷迭代器一起看。jdk1.8發布后,對于并行處理的能力大大增強,Spliterator就是為了并行遍歷元素而設計的一個迭代器,jdk1.8中的集合框架中的數據結構都默認實現了spliterator,后面我們也會結合ArrayList中的spliterator()一起解析。

Spliterator內部結構

//單個對元素執行給定的動作,如果有剩下元素未處理返回true,否則返回false boolean tryAdvance(Consumer<? super T> action);//對每個剩余元素執行給定的動作,依次處理,直到所有元素已被處理或被異常終止。默認方法調用tryAdvance方法 default void forEachRemaining(Consumer<? super T> action) {do { } while (tryAdvance(action)); }//對任務分割,返回一個新的Spliterator迭代器 Spliterator<T> trySplit();//用于估算還剩下多少個元素需要遍歷 long estimateSize();//當迭代器擁有SIZED特征時,返回剩余元素個數;否則返回-1 default long getExactSizeIfKnown() {return (characteristics() & SIZED) == 0 ? -1L : estimateSize(); }//返回當前對象有哪些特征值 int characteristics();//是否具有當前特征值 default boolean hasCharacteristics(int characteristics) {return (characteristics() & characteristics) == characteristics; } //如果Spliterator的list是通過Comparator排序的,則返回Comparator //如果Spliterator的list是自然排序的 ,則返回null //其他情況下拋錯 default Comparator<? super T> getComparator() {throw new IllegalStateException(); }

JDK8源碼內的ArrayList中的ArrayListSpliterator

static final class ArrayListSpliterator<E> implements Spliterator<E> {//用于存放ArrayList對象private final ArrayList<E> list;//起始位置(包含),advance/split操作時會修改private int index;//結束位置(不包含),-1 表示到最后一個元素private int fence;//用于存放list的modCountprivate int expectedModCount;ArrayListSpliterator(ArrayList<E> list, int origin, int fence,int expectedModCount) {this.list = list;this.index = origin;this.fence = fence;this.expectedModCount = expectedModCount;}//獲取結束位置(存在意義:首次初始化石需對fence和expectedModCount進行賦值)private int getFence() {int hi;ArrayList<E> lst;//fence<0時(第一次初始化時,fence才會小于0):if ((hi = fence) < 0) {//list 為 null時,fence=0if ((lst = list) == null)hi = fence = 0;else {//否則,fence = list的長度。expectedModCount = lst.modCount;hi = fence = lst.size;}}return hi;}//分割list,返回一個新分割出的spliterator實例public ArrayListSpliterator<E> trySplit() {//hi為當前的結束位置//lo 為起始位置//計算中間的位置int hi = getFence(), lo = index, mid = (lo + hi) >>> 1;//當lo>=mid,表示不能在分割,返回null//當lo<mid時,可分割,切割(lo,mid)出去,同時更新index=midreturn (lo >= mid) ? null :new ArrayListSpliterator<E>(list, lo, index = mid, expectedModCount);}//返回true 時,只表示可能還有元素未處理//返回false 時,沒有剩余元素處理了。。。public boolean tryAdvance(Consumer<? super E> action) {if (action == null)throw new NullPointerException();//hi為當前的結束位置//i 為起始位置int hi = getFence(), i = index;//還有剩余元素未處理時if (i < hi) {//處理i位置,index+1index = i + 1;@SuppressWarnings("unchecked") E e = (E)list.elementData[i];action.accept(e);//遍歷時,結構發生變更,拋錯if (list.modCount != expectedModCount)throw new ConcurrentModificationException();return true;}return false;}//順序遍歷處理所有剩下的元素public void forEachRemaining(Consumer<? super E> action) {int i, hi, mc; // hoist accesses and checks from loopArrayList<E> lst; Object[] a;if (action == null)throw new NullPointerException();if ((lst = list) != null && (a = lst.elementData) != null) {//當fence<0時,表示fence和expectedModCount未初始化,可以思考一下這里能否直接調用getFence(),嘿嘿?if ((hi = fence) < 0) {mc = lst.modCount;hi = lst.size;}elsemc = expectedModCount;if ((i = index) >= 0 && (index = hi) <= a.length) {for (; i < hi; ++i) {@SuppressWarnings("unchecked") E e = (E) a[i];//調用action.accept處理元素action.accept(e);}//遍歷時發生結構變更時拋出異常if (lst.modCount == mc)return;}}throw new ConcurrentModificationException();}public long estimateSize() {return (long) (getFence() - index);}public int characteristics() {//打上特征值:、可以返回sizereturn Spliterator.ORDERED | Spliterator.SIZED | Spliterator.SUBSIZED;} }

以上為源碼講解部分,大意是說,這個就是用來多線程并行迭代的迭代器,這個迭代器的主要作用就是把集合分成了好幾段,每個線程執行一段,因此是線程安全的。基于這個原理,以及modCount的快速失敗機制,如果迭代過程中集合元素被修改,會拋出異常。

  我們設計一個測試用例:創建一個長度為100的list,如果下標能被10整除,則該位置數值跟下標相同,否則值為aaaa。然后多線程遍歷list,取出list中的數值(字符串aaaa不要)進行累加求和。

測試代碼如下:

package com.turingschool.demo.ds;import java.util.ArrayList; import java.util.List; import java.util.Spliterator; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; import java.util.regex.Pattern;import org.junit.Test;public class Atest {AtomicInteger count = new AtomicInteger(0);List<String> strList = createList();Spliterator spliterator = strList.spliterator();/*** 多線程計算list中數值的和 測試spliterator遍歷*/@Testpublic void mytest() {for (int i = 0; i < 4; i++) {new MyThread().start();}try {Thread.sleep(15000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("結果為:" + count);}class MyThread extends Thread {@SuppressWarnings("unchecked")@Overridepublic void run() {final String threadName = Thread.currentThread().getName();System.out.println("線程" + threadName + "開始運行-----");spliterator.trySplit().forEachRemaining(new Consumer() {@Overridepublic void accept(Object o) {if (isInteger((String) o)) {int num = Integer.parseInt(o + "");count.addAndGet(num);System.out.println("數值:" + num + "------" + threadName);try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}}});System.out.println("線程" + threadName + "運行結束-----");}}private List<String> createList() {List<String> result = new ArrayList<>();for (int i = 0; i < 100; i++) {if (i % 10 == 0) {result.add(i + "");} else {result.add("aaa");}}return result;}public static boolean isInteger(String str) {Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");return pattern.matcher(str).matches();} }

運行結果為:

從結果可以看出,四個線程遍歷沒有產生并發問題,

本文參考:https://www.cnblogs.com/nevermorewang/p/9368431.html??????? 謝謝~

總結

以上是生活随笔為你收集整理的今天读了JDK1.8源码,知道了并行迭代器Spliterator的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 综合在线观看 | 男人的天堂av网站 | 91久久精品www人人做人人爽 | 色综合综合网 | 俄罗斯av片 | 久久av一区二区三 | 欧美成人精品一区 | 自拍偷拍福利视频 | 成人黄色一区二区三区 | 日本亚洲色图 | 国产资源在线看 | 久久看av | 国产乱码精品一区二区三区忘忧草 | 国产精品一区二区入口九绯色 | 激情五月亚洲 | 高清乱码毛片入口 | julia一区二区三区中文字幕 | 91国产丝袜播放在线 | 夜夜躁日日躁狠狠久久av | 久久久久亚洲av片无码下载蜜桃 | 黑人干日本少妇 | 免费无码毛片一区二区app | 琪琪女色窝窝777777 | 久久综合久久综合久久综合 | 张柏芝亚洲一区二区三区 | 日韩欧美色 | 九九热精 | 久草视频福利在线 | 干骚视频 | 日本免费一二三区 | 国产精品一区网站 | 亚洲精品一二 | 欧日韩一区二区三区 | 国产xx在线观看 | 亚洲码在线观看 | 青娱网电信一区电信二区电信三区 | 米奇影音 | 综合av在线 | 成人日b视频 | 99热这里只有精品久久 | 图片区 小说区 区 亚洲五月 | 日韩精品一区二区三区网站 | 国产精品入口a级 | 中文字幕一区二区三区四区欧美 | 国产一级影片 | 九草影院 | 日韩成人午夜电影 | av午夜影院 | 91亚洲精品久久久久久久久久久久 | 黄色性生活一级片 | 日韩在线二区 | 欧美变态另类刺激 | 亚洲欧美日韩在线不卡 | 精品人妻一区二区三区久久 | 亚洲精品无码久久久久 | 亚洲专区免费 | 亚洲人免费 | 91人妻一区二区三区蜜臀 | 国产熟女高潮视频 | 国产小精品 | 五十路av在线| 国产一区二区三区自拍 | 艳母日本动漫在线观看 | 精品国产午夜福利 | 最近中文字幕mv免费高清在线 | 97视频免费| 日韩精品 欧美 | 欧美成a| 成熟了的熟妇毛茸茸 | 视频福利在线 | 欧美高清hd18日本 | 亚洲 欧美 成人 | 久久婷色 | 午夜小视频免费 | 欧美精品1区2区 | 国产伦理在线 | 精品久久久久久久久久岛国gif | 欧美丰满少妇人妻精品 | 日韩电影一区二区三区 | 国产精选视频在线观看 | 中文字幕影片免费在线观看 | 免费v片在线观看 | 午夜福利电影 | 日韩精品成人一区二区在线 | 国产人妖一区二区三区 | 国产精品精品软件视频 | 奶水旺盛的少妇在线播放 | 欧美人体做爰大胆视频 | 国产吞精囗交久久久 | 极品女神无套呻吟啪啪 | 日本人体一区 | 亚洲天堂一区二区在线 | 久久精品国产清自在天天线 | 九九久久99 | 欧美亚洲韩国 | 亚洲免费av一区二区 | 91学生片黄 | 福利第一页| 四虎免费观看 |