Fork/Join线程池计算1~n的和简单实现,JDK1.8级以上用Stream流更方便。
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;
import lombok.extern.slf4j.Slf4j;
/**
* ForkJoin
*/
public class Test00 {
public static void main(String[] args) {
ForkJoinPool pool = new ForkJoinPool(2);
Integer i = pool.invoke(new MyTask2(1, 5));
System.out.println(i);
}
}
/**
* 计算1~n的值,优化(拆分任务,让并行度更高)
*/
@Slf4j(topic = "c.MyTask2")
class MyTask2 extends RecursiveTask<Integer> {
private int begin;
private int end;
/**
* @param begin
* @param end
*/
public MyTask2(int begin, int end) {
this.begin = begin;
this.end = end;
}
@Override
public String toString() {
return "MyTask2 [begin=" + begin + ", end=" + end + "]";
}
@Override
protected Integer compute() {
if (begin == end) {
log.info("join() {}", begin);
return begin;
}
if (end - begin == 1) {
log.info("join() {} + {} = {}", begin, end, begin + end);
return end + begin;
}
int mid = (end + begin) / 2;
MyTask2 t1 = new MyTask2(begin, mid);
t1.fork();
MyTask2 t2 = new MyTask2(mid + 1, end);
t2.fork();
log.info("fork() {} + {} = ?", t1, t2);
int result = t1.join() + t2.join();
log.info("join() {} + {} = {}", t1, t2, result);
return result;
}
}
/**
* 计算1~n的值
*/
@Slf4j(topic = "c.MyTask")
class MyTask extends RecursiveTask<Integer> {
private int n;
public MyTask(int n) {
this.n = n;
}
@Override
public String toString() {
return "MyTask [n=" + n + "]";
}
@Override
protected Integer compute() {
// 终止条件
if (n == 1) {
log.debug("join() {}", n);
return 1;
}
MyTask t = new MyTask(n - 1);
// 让一个线程去执行此任务
t.fork();
log.debug("fork() {} + {}", n, t);
// 获取任务结果
int result = n + t.join();
log.debug("join() {} + {} = {}", n, t, result);
return result;
}
}