一点一点看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();
}
}

运行结果:

以上!!

最新文章

  1. centos中基于随机数,再加入班级学生姓名
  2. iOS和Android测试区别
  3. bootstrap搜索框样式代码及效果
  4. sql:找出工资第二高的人名
  5. phpweb漏洞合集
  6. jQuery效果之隐藏与显示、淡入淡出、滑动、回调
  7. 【Leetcode】【Hard】Merge Intervals
  8. C#设计模式(5)——建造者模式(Builder Pattern)
  9. WebApi与手机客户端通信安全机制
  10. Java数组的--遍历
  11. Java--时间处理
  12. 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:2.搭建环境-2.4. 安装JDK
  13. 接入淘宝API(PHP版本)
  14. 10款无限滚动自动翻页jquery插件
  15. perl 对象 bless 引用
  16. ES6 系列之私有变量的实现
  17. springboot-01 helloworld
  18. Nagios安装与配置
  19. 基于properties文件的Spring Boot多环境切换
  20. JavaScript数组的一些奇葩行为

热门文章

  1. java设计模式之装饰者模式学习
  2. flask 简易注册登陆
  3. [国家集训队2012]middle(陈立杰)
  4. &quot;UTF-8&quot;、&quot;UTF8&quot;、&quot;utf-8&quot;、&quot;utf8&quot;之间的区别
  5. Springboot基础知识
  6. 08_Spring自定义标签
  7. 30_AQS
  8. 04_ActiveMQ事务与三种签收方式
  9. Spring boot配置注意事项
  10. named 快速部署及主机记录普及