一点一点看JDK源码(五)java.util.ArrayList 后篇之Spliterator多线程遍历

liuyuhang原创,未经允许禁止转载

本文举例使用的是JDK8的API

目录:一点一点看JDK源码(〇)

Spliterator为jdk1.8新增接口,由ArrayList.spliterator();获得其返回值对象Spliterator。

该对象可以使用trySplit进行迭代器拆分,每次拆分后的迭代器接近上一次的二分之一。

这是官方对于大数据量数组多线程遍历加工的一种趋势性指引。

首先需要定义一个线程,

然后需要将拆分后的迭代器传入该线程。

执行start()方法让实现的run()方法进入就绪状态等待调用

自定义线程代码如下:

 package com.FM.ArrayListStudy;

 import java.util.Spliterator;
import java.util.function.Consumer; /**
* 内部类,线程调用
*/
public class MyThread4Spliterator<T> extends Thread {
// 寄存变量
private Spliterator<T> list; // 构造 - 传递参数
public MyThread4Spliterator(Spliterator<T> list) {
setList(list);
} // 线程调用run
@Override
public void run() {
Spliterator<T> list2 = getList();
list2.forEachRemaining(new Consumer<T>() { @Override
public void accept(T t) {
System.out.println(Thread.currentThread().getName()+" === "+t);
} });
} public Spliterator<T> getList() {
return list;
} public void setList(Spliterator<T> list) {
this.list = list;
}
}

定义并拆分迭代器代码如下,需要注意拆分规则

 package com.FM.ArrayListStudy;

 import java.util.ArrayList;
import java.util.Spliterator; public class SpliteratorInArrayListStudy {
public static void main(String[] args) {
// 初始化list
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < 20; i++) {
list.add(i + 1);
}
//四线程均分配比方式
Spliterator<Integer> spliterator01 = list.spliterator();  //01中有20个元素
Spliterator<Integer> spliterator02 = spliterator01.trySplit(); //01中有10个元素,02中有10个元素
Spliterator<Integer> spliterator03 = spliterator01.trySplit(); //01中有5个元素,02中有10个元素,03中有5个元素
Spliterator<Integer> spliterator04 = spliterator02.trySplit(); //01中有5个元素,02中有5个元素,03中有5个元素,04中有5个元素
MyThread4Spliterator<Integer> t01 = new MyThread4Spliterator<Integer>(spliterator01);
MyThread4Spliterator<Integer> t02 = new MyThread4Spliterator<Integer>(spliterator02);
MyThread4Spliterator<Integer> t03 = new MyThread4Spliterator<Integer>(spliterator03);
MyThread4Spliterator<Integer> t04 = new MyThread4Spliterator<Integer>(spliterator04);
t01.setName("001");
t02.setName("002");
t03.setName("003");
t04.setName("004"); t01.start();
t02.start();
t03.start();
t04.start();
}
}

运行结果:

以上!!

一点一点看JDK源码(五)java.util.ArrayList 后篇之Spliterator多线程遍历的更多相关文章

  1. JDK1.8源码(五)——java.util.ArrayList 类

    关于 JDK 的集合类的整体介绍可以看这张图,本篇博客我们不系统的介绍整个集合的构造,重点是介绍 ArrayList 类是如何实现的. 1.ArrayList 定义 ArrayList 是一个用数组实 ...

  2. 一点一点看JDK源码(五)java.util.ArrayList 后篇之SubList

    一点一点看JDK源码(五)java.util.ArrayList 后篇之SubList liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) S ...

  3. 一点一点看JDK源码(五)java.util.ArrayList 后篇之forEach

    一点一点看JDK源码(五)java.util.ArrayList 后篇之forEach liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 代 ...

  4. 一点一点看JDK源码(五)java.util.ArrayList 后篇之sort与Comparator

    一点一点看JDK源码(五)java.util.ArrayList 后篇之sort与Comparator liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JD ...

  5. 一点一点看JDK源码(五)java.util.ArrayList 后篇之removeIf与Predicate

    一点一点看JDK源码(五)java.util.ArrayList 后篇之removeIf与Predicate liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点 ...

  6. JDK1.8源码(五)——java.util.Vector类

    JDK1.8源码(五)--java.lang. https://www.cnblogs.com/IT-CPC/p/10897559.html

  7. JDK1.8源码(一)——java.util.ArrayList

      ArrayList 定义 ArrayList 是一个用数组实现的集合,支持随机访问,元素有序且可以重复. public class ArrayList<E> extends Abstr ...

  8. JDK1.8源码(六)——java.util.ArrayList类

    ArrayList实现了Serializable接口,因此它支持序列化,能够通过序列化传输,实现了RandomAccess接口,支持快速随机访问,实际上就是通过下标序号进行快速访问,实现了Clonea ...

  9. 一点一点看JDK源码(〇)

    一点一点看JDK源码(〇) liuyuhang原创,未经允许进制转载 写在前面: 几乎所有的大神都会强调看源码,也强调源码的重要性: 但是如何看源码,源码看什么?看了什么用?看了怎么用? 困扰很多人, ...

随机推荐

  1. python全栈开发之路

    一.Python基础 python简介 python数据类型(数字\字符串\列表) python数据类型(元组\字典) python数据类型(集合) python占位符%s,%d,%r,%f prin ...

  2. JavaScript 数组对象常用属性

    concat() 用于连接两个或多个数组.该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本. var a = ["aa","ccc"]; var b ...

  3. iview中关于table组件内放入Input会失去焦点

    table里面的数据是一个数组,父组件传入的.子组件是截图的内容.当每个input框数据发生变化时,把数据传给父组件.在父组件做表单的提交. github内已经提到过这个问题(https://gith ...

  4. html+css中常见的浏览器兼容性处理

    1.居中问题 div里的内容,IE默认为居中,而FF默认为左对齐,可以尝试增加代码margin: 0 auto; 2.高度问题 两上下排列或嵌套的div,上面的div设置高度(height),如果di ...

  5. JavaScript中的原型和原型链

    1.原型是什么?原型链是什么? 原型是一个prototype对象,用于表示类型之间的关系: 原型链指的是在JavaScript中对象之间的继承是通过prototype对象指向父类对象,直到指向Obje ...

  6. 题目一:使用Java实现二维数组中的查找

    考点:数组       题目:二维数组中的查找   描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判 ...

  7. Python unittest模块心得(一)

    关于unittest模块的一些心得,主要是看官网的例子,加上一点自己的理解,官网地址:https://docs.python.org/3.6/library/unittest.html 基础概念介绍: ...

  8. Oracle从入门到精通 限定查询和排序查询的问题

    视频课程:李兴华 Oracle从入门到精通视频课程 学习者:阳光罗诺 视频来源:51CTO学院 知识点 SQL语句的执行顺序 限定符号的使用.   具体内容: 如果想要对所选择的数据进行控制,就可以使 ...

  9. 使用UIDynamicAnimator创建重力感应的View

    使用UIDynamicAnimator创建重力感应的View http://www.raywenderlich.com/zh-hans/52617/uikit-力学教程 详细教程请参考上面的链接,此处 ...

  10. Google play billing(Google play 内支付) 下篇

    开篇: 如billing开发文档所说,要在你的应用中实现In-app Billing只需要完成以下几步就可以了. 第一,把你上篇下载的AIDL文件添加到你的工程里,第二,把 <uses-perm ...