0
点赞
收藏
分享

微信扫一扫

并行数据处理与性能


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

举报

相关推荐

0 条评论