??????????Java Tutorials?е?fork/join???????????
????????fork/join???
????fork/join?????ExecutorService????????????????????????????????????????????????д????????е?????????ó??????????????????????????Щ???????????????
????fork/join?????????ExecutorService????????????????????е???????????????????????????????????????ν?????????????????Щ??????????????????????????????????????С?
????fork/join?????????ForkJoinPool??????????AbstractExecutorService??ForkJoinPool??????????????????????? ForkJoinTask????
??????????÷???
?????????fork/join???????????????????????з????????????????????α?????????
????if (??????С){
?????????и?????;
????}else{
????????????????;
???????????????????????;
????}
????????????????ForkJoinTask???????з???????????????????????????????ForkJoinTask??????? RecursiveTask???????????????????RecursiveAction??
??????д??ForkJoinTask????????????????????????????????????????????????????????ForkJoinPool?????invoke()???м??ɡ?
????????-??????
?????????????????fork/join???????ι?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????RBG?????????????????λ?У??????????????????????????鹹????????????????RBG????????
??????????????????????????????????????????????????Χ??????????????????RGB?????????????????????????С??????????????????飬??????????????????????????????fork/join???????????????????????????в??м???????????????????????????????????????????????
????Tips????????????????fork/join??????????????????÷???????????????????????????ж?
public class ForkBlur extends RecursiveAction {
private static final long serialVersionUID = -8032915917030559798L;
private int[] mSource;
private int mStart;
private int mLength;
private int[] mDestination;
private int mBlurWidth = 15; // Processing window size?? should be odd.
public ForkBlur(int[] src?? int start?? int length?? int[] dst) {
mSource = src;
mStart = start;
mLength = length;
mDestination = dst;
}
// Average pixels from source?? write results into destination.
protected void computeDirectly() {
int sidePixels = (mBlurWidth - 1) / 2;
for (int index = mStart; index < mStart + mLength; index++) {
// Calculate average.
float rt = 0?? gt = 0?? bt = 0;
for (int mi = -sidePixels; mi <= sidePixels; mi++) {
int mindex = Math.min(Math.max(mi + index?? 0)?? mSource.length - 1);
int pixel = mSource[mindex];
rt += (float) ((pixel & 0x00ff0000) >> 16) / mBlurWidth;
gt += (float) ((pixel & 0x0000ff00) >> 8) / mBlurWidth;
bt += (float) ((pixel & 0x000000ff) >> 0) / mBlurWidth;
}
// Re-assemble destination pixel.
int dpixel = (0xff000000)
| (((int) rt) << 16)
| (((int) gt) << 8)
| (((int) bt) << 0);
mDestination[index] = dpixel;
}
}
...
?????????????????дcompute()???????????÷???????????????????????????????????????????鳤?????sThreshold?????????????????????????л?????л????
@Override
protected void compute() {
if (mLength < sThreshold) {
computeDirectly();
return;
}
int split = mLength / 2;
invokeAll(new ForkBlur(mSource?? mStart?? split?? mDestination)??
new ForkBlur(mSource?? mStart + split?? mLength - split??
mDestination));
}
???????????????2??輴???????????????????
????1????????????????
????ForkBlur fb = new ForkBlur(src?? 0?? src.length?? dst);
????2??????ForkJoinPool
????ForkJoinPool pool = new ForkJoinPool();
????3???????????????
????pool.invoke(fb);