一点一点看JDK源码(五)java.util.ArrayList 后篇之Spliterator多线程遍历
一点一点看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多线程遍历的更多相关文章
- JDK1.8源码(五)——java.util.ArrayList 类
关于 JDK 的集合类的整体介绍可以看这张图,本篇博客我们不系统的介绍整个集合的构造,重点是介绍 ArrayList 类是如何实现的. 1.ArrayList 定义 ArrayList 是一个用数组实 ...
- 一点一点看JDK源码(五)java.util.ArrayList 后篇之SubList
一点一点看JDK源码(五)java.util.ArrayList 后篇之SubList liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) S ...
- 一点一点看JDK源码(五)java.util.ArrayList 后篇之forEach
一点一点看JDK源码(五)java.util.ArrayList 后篇之forEach liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 代 ...
- 一点一点看JDK源码(五)java.util.ArrayList 后篇之sort与Comparator
一点一点看JDK源码(五)java.util.ArrayList 后篇之sort与Comparator liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JD ...
- 一点一点看JDK源码(五)java.util.ArrayList 后篇之removeIf与Predicate
一点一点看JDK源码(五)java.util.ArrayList 后篇之removeIf与Predicate liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点 ...
- JDK1.8源码(五)——java.util.Vector类
JDK1.8源码(五)--java.lang. https://www.cnblogs.com/IT-CPC/p/10897559.html
- JDK1.8源码(一)——java.util.ArrayList
ArrayList 定义 ArrayList 是一个用数组实现的集合,支持随机访问,元素有序且可以重复. public class ArrayList<E> extends Abstr ...
- JDK1.8源码(六)——java.util.ArrayList类
ArrayList实现了Serializable接口,因此它支持序列化,能够通过序列化传输,实现了RandomAccess接口,支持快速随机访问,实际上就是通过下标序号进行快速访问,实现了Clonea ...
- 一点一点看JDK源码(〇)
一点一点看JDK源码(〇) liuyuhang原创,未经允许进制转载 写在前面: 几乎所有的大神都会强调看源码,也强调源码的重要性: 但是如何看源码,源码看什么?看了什么用?看了怎么用? 困扰很多人, ...
随机推荐
- Effective C++ .44 typename和class的不同
在C++模板中的类型参数一般可以使用typename和class,两者没有什么不同.但是typename比class多项功能: “任何时候当你想要在template中指涉一个嵌套从属类型名称,就必须在 ...
- express实现todolist
app.js var express = require('express'); var todoController = require('./controllers/todoController. ...
- flask 继承模版的基本使用1
- DB DBS 和DBMS区别
DB:是指datebase(数据库) DBS:是指datebase systerm (数据库系统) DBMS:是指datebase mangement systerm(数据库管理系统)区别:数据库 ...
- VS.Net开发必备,让您的代码自动收缩,如何实现!
一年前,不知在哪里看到这个开发辅助插件,就装上了,之后一直不知不觉得用着,有一天重装了系统,这插件不见了,再也记不起他的名字, 在网上搜索"自动收缩代码","VS开发必备 ...
- C++基础--class的大小
在这里列出了空类,类有函数,值,没有函数的大小,注意Class也是默认字节对齐 #include <stdio.h> class x { }; class cx { public: cx( ...
- CentOS 7运维管理笔记(5)----源代码安装Apache 2.4,搭建LAMP服务器
########################## 2016-07-07-Thu--20:34 补充 ##################### 编译安装OpenSSL笔记: 如果系统要使用 ...
- Windows API-----top level window
原文地址: http://blog.163.com/cumt_xl/blog/static/19071504420136911838683/ Q: What is a top-level window ...
- Java类——JDBC链接、并操作MySQL数据库
Java——MySQL数据库操作类 package pkg.src.database; import java.sql.*; public class MYSQL_DBManager { // //定 ...
- 第四次作业-第一次scrum冲刺
团队成员 周斌 舒 溢 许嘉荣 唐 浩 黄欣欣 1.第一次冲刺任务安排 对Github上的HUSTOJ开源项目进行Fork,搭建基本环境 2.用户需求 ①基本功能显示在首页 ②能够提交题目并判题,并对 ...