java一个大接口拆用多线程方式拆分成多个小接口

时间:2021-11-24 02:40:46

问题引入

目的:我们的接口A  分别调用了a1 a2 a3 三个接口,最终返回值是 a1的返回值+a2的返回值+a3的返回值

如果同步执行 a1 a2 a3 然后结果相加 很慢 。

如果异步执行 无法控制 三个线程同时执行完毕后 在结束此方法。

解决办法

Fork/Join框架是Java 7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架

1.ForkJoinTask:我们要使用Fork/Join框架,首先需要创建一个ForkJoin任务。该类提供了在任务中执行fork和join的机制。通常情况下我们不需要直接集成ForkJoinTask类,只需要继承它的子类,Fork/Join框架提供了两个子类:

  a.RecursiveAction:用于没有返回结果的任务

  b.RecursiveTask:用于有返回结果的任务

公共抽象类ForkJoinTask是fork/join的基石类。实现了Future接口。可以看成是一个轻量级的Future。

2.ForkJoinPool:ForkJoinTask需要通过ForkJoinPool来执行

Fork/Join和Callable/FutureTask类似

一个简单的demo:

@Test
public void testMybatis(){
RecursiveTask<Object> recursiveTask = new RecursiveTask<Object>() {
@Override
protected Object compute() {
return "你";
}
};
RecursiveTask<Object> recursiveTask2 = new RecursiveTask<Object>() {
@Override
protected Object compute() {
return "们";
}
};
RecursiveTask<Object> recursiveTask3 = new RecursiveTask<Object>() {
@Override
protected Object compute() {
return "好";
}
};
forkJoinPool.execute(recursiveTask);
forkJoinPool.execute(recursiveTask2);
forkJoinPool.execute(recursiveTask3);
Object join = recursiveTask.join();
Object join2 = recursiveTask2.join();
Object join3 = recursiveTask3.join();
System.err.println("最终结果==="+join+join2+join3);
}

打印结果:你们好

这里只写了demo。至于原理这篇博客写的很不错了:https://www.cnblogs.com/senlinyang/p/7885964.html