static class StockTypeForkJoinTask extends RecursiveTask<List<StoreProducts>> {
private Integer size;
private List<StoreProducts> storeProductsList;
private RedisTemplate redisTemplate;
private static Integer ONE = 1;
private static Integer ZERO = 0;
public StockTypeForkJoinTask(List<StoreProducts> storeProductsList, RedisTemplate redisTemplate) {
this.storeProductsList = storeProductsList;
this.redisTemplate = redisTemplate;
}
@Override
protected List<StoreProducts> compute() {
if(storeProductsList.size() < 20) {
storeProductsList.forEach(o-> {
try {
Integer stockType = 1;
String ecState = redisTemplate.hget(redisKey, String.valueOf(o.getStoreId()));
if (ecState != null) {
if (ONE.equals(o.getProductType()) && ONE.equals(ecState)) {
stockType = 3;
} else if (ZERO.equals(o.getProductType()) && ONE.equals(ecState)) {
stockType = 2;
}
} else {
}
o.setStockType(stockType);
} catch (RedisAccessException e) {
e.printStackTrace();
}
});
return storeProductsList;
}
// 否则再进行任务拆分,拆分成两个任务
else {
ForkJoinTask subTask1 = new StockTypeForkJoinTask(storeProductsList.subList(0, storeProductsList.size()/2), redisTemplate);
ForkJoinTask subTask2 = new StockTypeForkJoinTask(storeProductsList.subList(storeProductsList.size()/2, storeProductsList.size()), redisTemplate);
invokeAll(subTask1, subTask2);
List<StoreProducts> res = new ArrayList<>();
List<StoreProducts> res1 = (List<StoreProducts>) subTask1.join();
for (StoreProducts o : res1) {
res.add(o);
}
List<StoreProducts> res2 = (List<StoreProducts>) subTask2.join();
for (StoreProducts o : res2) {
res.add(o);
}
return res;
}
}
}
使用
ForkJoinPool pool = new ForkJoinPool();
ForkJoinTask<List<StoreProducts>> taskFuture = pool.submit(new StockTypeForkJoinTask(storeProductsList, redisTemplate));
storeProductsList = taskFuture.get();
pool.shutdown();