并发编程(十二)ForkJoin框架使用

所用较少,就不再分析太多了

ForkJoin框架使用

public class LongSum extends RecursiveTask<Long> {

    static final int SEQUENTIAL_THRESHOLD = 1000;


    int low;
    int high;
    int[] array;

    LongSum(int[] arr, int lo, int hi) {
        array = arr;
        low = lo;
        high = hi;
    }

    /**
     * fork()方法:将任务放入队列并安排异步执行,一个任务应该只调用一次fork()函数,除非已经执行完毕并重新初始化。
     * tryUnfork()方法:尝试把任务从队列中拿出单独处理,但不一定成功。
     * join()方法:等待计算完成并返回计算结果。
     * isCompletedAbnormally()方法:用于判断任务计算是否发生异常。
     */
    protected Long compute() {
        if (high - low <= SEQUENTIAL_THRESHOLD) {
            long sum = 0;
            for (int i = low; i < high; ++i) {
                sum += array[i];
            }
            return sum;

        } else {
            int mid = low + (high - low) / 2;
            LongSum left = new LongSum(array, low, mid);
            LongSum right = new LongSum(array, mid, high);
            left.fork();
            right.fork();
            long rightAns = right.join();
            long leftAns = left.join();
            return leftAns + rightAns;
        }
    }
}
public class LongSumMain {
	//获取逻辑处理器数量
	static final int NCPU = Runtime.getRuntime().availableProcessors();

	public static void main(String[] args) throws Exception {
		long start = System.currentTimeMillis();
		int[] array = new int[20000000];
		Random random = new Random();
		for (int i = 0; i < 20000000; i++) {
			array[i] = random.nextInt(100);
		}
		//采用fork/join方式将数组求和任务进行拆分执行,最后合并结果
		LongSum longSum = new LongSum(array, 0, array.length);
  		ForkJoinPool forkJoinPool  = new ForkJoinPool(NCPU); //使用的线程数
		ForkJoinTask<Long> task = forkJoinPool.submit(longSum);
		System.out.println("forkjoin sum=" + task.get());

		if(task.isCompletedAbnormally()){
			System.out.println(task.getException().toString());
		}
		forkJoinPool.shutdown();
	}
}

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×