多线程----Fork/Join框架

什么是Fork/Join框架?




工作窃取算法:





步骤设计:




实验代码:

package com.duoduo.Thread;

import java.util.concurrent.RecursiveTask;

public class CountTask extends RecursiveTask<Integer>{
	private static final int THREADHOLD=2;   //定义阈值
	private int start;
	private int end;
	public CountTask(int start,int end) {
		this.start=start;
		this.end=end;
	}
	@Override
	//计算函数
	protected Integer compute() {
		int sum=0;
		boolean canCompute=(end-start)<=THREADHOLD;
		//如果任务足够小则直接计算
		if(canCompute) {  
			for(int i=start; i<=end;i++) {
				sum+=i;
			}
		//否则 大任务分解成为两个小任务计算
		}else {
			int middle=(start+end)/2;
			//分解任务 递归函数
			CountTask leftTask=new CountTask(start,middle);
			CountTask rightTask=new CountTask(middle+1,end);
			//执行子任务
			leftTask.fork();
			rightTask.fork();
			//等待子任务结束后得到其结果
			int leftResult=leftTask.join();
			int rightResult=rightTask.join();
			//合并子任务
			sum=leftResult+rightResult;
		}
		return sum;
	}
}

package com.duoduo.Thread;

import com.duoduo.Thread.CountTask; 
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.Future;

public class TestCountTask {
	public static void main(String []args) {
		ForkJoinPool forkJoinPool=new ForkJoinPool();
		//生成一个计算任务  负责计算1+2+3+4
		CountTask task=new CountTask(1,4);
		//执行任务
		Future<Integer> result=forkJoinPool.submit(task);
		try {
			System.out.println(result.get());
		}catch(InterruptedException  e) {
		}catch (ExecutionException e) {
		}
	}
}


实验总结:



异常处理:


public class TestCountTask {
	public static void main(String []args) {
		ForkJoinPool forkJoinPool=new ForkJoinPool();
		//生成一个计算任务  负责计算1+2+3+4
		CountTask task=new CountTask(1,4);
		//执行任务
		Future<Integer> result=forkJoinPool.submit(task);
		try {
			System.out.println(result.get());
		}catch(InterruptedException  e) {
		}catch (ExecutionException e) {
		}
		//加了一行检测是否有异常抛出的代码
		System.out.println(task.isCompletedAbnormally());
	}
}



证明无异常出现



操作原理:




猜你喜欢

转载自blog.csdn.net/duoduo18up/article/details/80226839