java中的fork-join框架
import com.google.common.collect.Lists; import java.util.Arrays; import java.util.List; import java.util.concurrent.RecursiveTask; /** * 批量插入数据任务类 * 利用fork-join框架对数据插入任务进行分组,变成分组插入 * * @author wangjing */ public class BatchInsertTask extends RecursiveTask<Integer> { /** * 要插入的数据 */ List<Integer> records; private static final Integer OFFSET = 5; public BatchInsertTask(List<Integer> records) { this.records = records; } @Override protected Integer compute() { //当要插入的数据少于3,则直接插入 if (records.size() <= OFFSET) { return computeDirectly(); } else { //如果要插入的数据大于等于3,则进行分组插入 int size = records.size(); int limit = size % OFFSET == 0 ? size / OFFSET : size / OFFSET + 1; Integer sum = 0; List<BatchInsertTask> taskList = Lists.newArrayList(); for (int i = 0; i < limit; i++) { int max = OFFSET * (i + 1) > size ? size : OFFSET * (i + 1); BatchInsertTask task = new BatchInsertTask(records.subList(i * OFFSET, max)); task.fork(); taskList.add(task); } for (BatchInsertTask task : taskList) { sum += task.join(); } return sum; } } /** * 真正插入数据的逻辑 */ private int computeDirectly() { try { Thread.sleep((long) (records.size() * 1000)); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("插入了:" + Arrays.toString(records.toArray())); return records.size(); } }
import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; /** * 练习使用fork-join * * @author wangjing */ public class TestForkJoin { public static void main(String[] args) throws ExecutionException, InterruptedException { ForkJoinPool forkJoinPool = new ForkJoinPool(8); List<Integer> list = new ArrayList<>(); list.add(1); list.add(1); list.add(1); list.add(1); list.add(1); list.add(1); list.add(1); list.add(1); list.add(1); list.add(1); list.add(1); list.add(1); BatchInsertTask batchInsertTask = new BatchInsertTask(list); ForkJoinTask<Integer> reslut = forkJoinPool.submit(batchInsertTask); System.out.println(reslut.get());
forkJoinPool.shutdown();
} }