背景
在编写业务代码时经常遇到并发执行多个任务的需求,因为串行执行太慢,会影响业务代码性能。特别对于用户来说用户体验至关重要,保证用户体验重要的一点是要“快”。业务代码中经常需要调用其它业务接口或者同时从多个数据源取数据再处理等,这种情况下势必要走网络请求,网络消耗必不可少,最好的情况是毫秒级别,一般情况下是几十毫秒级别,甚至几百毫秒,因此,为了满足性能,我们就要使用并发编程。
那么如何实现并发运行呢,这里我们就要用到RecursiveTask
/**
* @ClassName: RecursiveTaskDemo
* @Auther: Jerry
* @Date: 2020/1/16 16:02
* @Desctiption: TODO
* @Version: 1.0
*/
public class RecursiveTaskDemo {
public void test(){
ForkJoinPool pool = new ForkJoinPool();
// 定义一个map,用于存储调用接口返回数据
Map<String, Object> retMap = new HashMap<String, Object>();
retMap = pool.invoke(new RecursiveTask<Map<String, Object>>(){// 将一个任务分解成多个小任务
@Override
protected Map<String, Object> compute() {
// 调用接口1
RecursiveTask<Map<String, Object>> task1 = new RecursiveTask<Map<String, Object>>() {
@Override
protected Map<String, Object> compute() {
// 任务1处理逻辑
return null;
}
};
// 调用接口2
RecursiveTask<Map<String, Object>> task2 = new RecursiveTask<Map<String, Object>>() {
@Override
protected Map<String, Object> compute() {
// 任务2处理逻辑
return null;
}
};
// 并行执行两个小任务
task1.fork();
task2.fork();
Map<String, Object> retMap = new HashMap<String, Object>();
// 得到两个小任务处理的结果
Map<String, Object> resMap1 = task1.join();
Map<String, Object> resMap2 = task2.join();
retMap.put("resMap1", resMap1);
retMap.put("resMap2", resMap2);
return retMap;
}
});
// 关闭线程池
pool.shutdown();
// 这里可根据你存储的数据类型强转
Object resMap1 = retMap.get("resMap1");
Object resMap2 = retMap.get("resMap2");
}
}
上面的Object resMap1 = retMap.get("resMap1"),可根据你的数据结构进行强转
Object resMap1 = retMap.get("resMap1");
// 比如你的数据结构是JSONObject,可以这样写
JSONObject jsonObj1 = (JSONObject) retMap.get("resMap1");
怎么样?是不是很简单呢。