在CountedCompleter的类注释中,有个关于CountedCompleter如何应用到MapReduce场景的示例代码,这里稍微理了下思路。
示例如下:
class MapReducer<E> extends CountedCompleter<E>{
final E[] array;
final MyMapper<E> mapper;
final MyReducer<E> reducer;
final int low, high;
MapReducer<E> forks, next;
E result;
public MapReducer(
CountedCompleter<?> completer,
E[] array,
MyMapper<E> mapper,
MyReducer<E> reducer,
int low,
int high,
MapReducer<E> next) {
super(completer);
this.array = array;
this.mapper = mapper;
this.reducer = reducer;
this.low = low;
this.high = high;
this.next = next;
}
@Override
public void compute() {
int l = low, h = high;
while (h - l > 1){
int mid = (l + h) >>> 1; //向右移一位 等效 除以2
addToPendingCount(1);
forks = new MapReducer<>(this, array, mapper, reducer, mid, h, forks);
forks.fork();
h = mid;
}
if (h > l){
result = mapper.apply(array[l]);
}
for (CountedCompleter<?> c = firstComplete(); c != null; c = c.nextComplete()){
for (MapReducer<E> t = (MapReducer) c, s = t.forks; s != null; s = t.forks = s.next){
E tr = t.result;
E sr = s.result;
t.result = reducer.apply(tr, sr);
}
}
}
@Override
public E getRawResult() {
return result;
}
public static <E> E mapReduce(E[] array, M