JAVA7 FORK/JOIN

Fork/Join框架设计目标就是可以容易地将算法并行化、分治化,Fork/Join框架设计目标就是可以容易地将算法并行化、分治化。

ForkJoinPool类是ForkJoinTask实例的执行者,ForkJoinPool的主要任务就是”工作窃取”,其线程尝试发现和执行其他任务创建的子任务。ForkJoinTask实例与普通Java线程相比是非常轻量的。

ForkJoinTask有两个主要的方法:

  • fork () – 这个方法决定了ForkJoinTask的异步执行,凭借这个方法可以创建新的任务。
  • join () – 该方法负责在计算完成后返回结果,因此允许一个任务等待另一任务执行完成。

求和或归并排序使用

class Client {
	public void result() {
		int processors = Runtime.getRuntime().availableProcessors();
		Calculate c = new Calculate(1, 5);
		SumTask task = new SumTask(c);
		ForkJoinPool pool = new ForkJoinPool(processors);
		pool.invoke(task);
		System.out.println("result: " + task.getResult());
	}
}

class SumTask extends RecursiveTask<Integer> {

	private static final long serialVersionUID = 10001L;

	private Calculate c;

	private int result;

	public SumTask(Calculate c) {
		this.c = c;
	}

	@Override
	protected Integer compute() {
		if (c.getNum() < 2) {
			result = c.calculate();
		} else {
			SumTask task1 = new SumTask(new Calculate(c.getStart(), c.getNum() / 2));
			SumTask task2 = new SumTask(new Calculate(c.getNum() / 2 + 1, c.getNum()));
			task1.fork();
			result = task2.compute() + task1.join();
		}
		return result;
	}

	public int getResult() {
		return result;
	}
}

class Calculate {
	private int num;
	private int start;

	public Calculate(int start, int end) {
		this.num = end - start + 1;
		this.start = start;
	}

	public int calculate() {
		return start;
	}

	public int getNum() {
		return this.num;
	}

	public int getStart() {
		return start;
	}
}

 

你可能感兴趣的:(java7)