并行数据处理与性能

1、LongStream.rangeClosed与iterate相比有两个优点
LongStream.rangeClosed直接产生原始类型long数字,没有拆箱装箱的开销
LongStream.rangeClosed会生成数字范围,很容易拆分为独立的小块。
2、分支/合并框架
(1)使用RecursiveTask
要把任务提交到这个池,必须创建RecursiveTask<R>的一个子类,其中R是并行化任务(以 及所有子任务)产生的结果类型,或者如果任务不返回结果,则是RecursiveAction类型(当 然它可能会更新其他非局部机构)。要定义RecursiveTask,只需实现它唯一的抽象方法 compute:
protected abstract R compute();
if (任务足够小或不可分) { 顺序计算该任务
} else {
将任务分成两个子任务 递归调用本方法,拆分每个子任务,等待所有子任务完成 合并每个子任务的结果
}
3. “可分迭代器”(splitable iterator)。和 Iterator 一样, Spliterator 也用于遍历数据源中的元素 .
public interface Spliterator<T> { boolean tryAdvance(Consumer<? super T> action); Spliterator<T> trySplit(); long estimateSize(); int characteristics();
}
注: tryAdvance 方法 会按顺序逐个使用 Spliterator 的元素,若还有其他元素要遍历则返回true
estimateSize方法估计还剩多少元素要遍历
特性
含义
ORDERED
元素有既定的顺序(例如List),因此Spliterator在遍历和划分时也会遵循这一顺序
DISTINCT
对于任意一对遍历过的元素x和y,x.equals(y)返回false
SORTED
遍历的元素按照一个预定义的顺序排序
SIZED
该Spliterator由一个已知大小的源建立(例如Set),因此estimatedSize()返回的是准确值
NONNULL
保证遍历的元素不会为null
IMMUTABLE
Spliterator的数据源不能修改。这意味着在遍历时不能添加、删除或修改任何元素
CONCURRENT
该Spliterator的数据源可以被其他线程同时修改而无需同步
SUBSIZED
该Spliterator和所有从它拆分出来的Spliterator都是SIZED

猜你喜欢

转载自blog.csdn.net/lyx_win/article/details/80559246