一点一点看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. httpclient x-www-form-urlencoded

    1. 使用Apache httpclient提交post请求 http工具方法(需指定编码, 否则出错,这里用的UTF-8) public static String postWithParamsFo ...

  2. 11.6NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 100 + 100 = 300\) 实际得分:\(100 +100 +100 = 300\) 学OI两年终于AK了一次qwq(虽然题目炒鸡水..) 纪念一下这令人激 ...

  3. Java入门到精通——调错篇之Astah Community打开报需要jre1.7运行环境

    1.问题概述     Astah Community安装完以后点击运行Astah Community的时候报此应用需要jdk1.7如下图     但是我的电脑在D盘装了jdk1.8了为什么这个软件为什 ...

  4. ArcSDE10.2.2使用SQL操作ST_Geometry时报ORA-28579或ORA-20006错误

    ArcSDE10.2.2使用SQL操作ST_Geometry时报ORA-28579或ORA-20006错误 1.测试环境说明 ArcSDE版本:10.2.2 Oracle版本:12.1.0.1和11. ...

  5. seo搜索引擎优化

    1.logo 图片换文字 比较好的方法,就是用背景图呈现,标签中写文字,因为文字能被搜索引擎抓取.(background) <h1><a href="##"> ...

  6. 1.初次运行git前的配置

    在系统上安装了 Git后,你会想要做几件事来定制你的 Git 环境. 每台计算机上只需要配置一次,程序升级时会保留配置信息. 你可以在任何时候再次通过运行命令来修改它们. Git 自带一个 git c ...

  7. 如果Android的jar包导入错误,怎么修改呢?

    如果jar包导入错误,怎么修改呢? 右键工程---->properties---->Java Build Path --->Libraries-->选择android-supp ...

  8. 用CIFilter生成QRCode二维码图片

    用CIFilter生成QRCode二维码图片 CIFilter不仅仅可以用来做滤镜,它还可以用来生成二维码. CIFilterEffect.h + CIFilterEffect.m // // CIF ...

  9. 允许远程链接mysql,开放3306端口

    首先查看端口是否打开 netstat -an|grep 3306 此图为开启3306端口的截图,之前显示为. . . 127.0.0.1:3306 . . . 打开mysql配置文件vi /etc/m ...

  10. Linux 命令行 发送邮件

    1.mail -s hi xx@yy.com 给xx@yy.com发一封主题为hi的信(没有正文) 编辑完内容后Ctrl-D结束. 2.echo "This is a test mail!& ...