1.分而治之
分而治之简单来说就是将大任务拆分为多个小任务分别执行。假如规模为M的问题,如果规模小于条件阈值N,则直接计算。否则将任务拆分为两个小任务,再进行判断,直到任务不可再分。最后将任务的结果合并。
2.工作密取
工作密取简单来说就是帮别人干活。假如线程A中有自己工作队列,线程B也有自己工作队列。线程A完成自己所有任务,而发现线程B还没有时候,可以从线程B的工作队列中获取任务执行。
3.ForkJoin框架
结合上面两个,forkjoin框架工作原理:首先将把大的任务分割成足够小的子任务,如果子任务比较大的话还要对子任务进行继续分割。然后分割的子任务分别放到双端队列里,然后几个启动线程分别从双端队列里获取任务执行。子任务执行完的结果都放在另外一个队列里,启动一个线程从队列里取数据,然后合并这些数据。
4.重要类说明
ForkJoinTask类:
抽象类,这个就是任务类,java提供了两个实现类:
- RecursiveAction:用于没有返回结果的任务
- RecursiveTask:用于有返回结果的任务
ForkJoinPool类:
任务执行的地方,内部包含执行线程ForkJoinWorkerThread。
5.使用
ForkJoinPool pool = new ForkJoinPool()
RecursiveAction task = new MyRecursiveAction();
pool.submit(task);
ForkJoinPool中提交任务有三个方法:
- submit:同步
- invoke:异步
- execute:异步