Fork/Join框架的简单学习和简单demo
来源:互联网 发布:怎么联系淘宝卖家 编辑:程序博客网 时间:2024/05/29 03:12
对于高并发来说,这一直是痛点, 今天有学 了下Fork/Join框架,其中他的主要类有以下几种:
ForkjoinTask<V>:描述任务的抽象类
ForkJoinPool:管理ForkJoinTask的线程池
RecursiveAction:ForkJoinTask子类,描述无返回值的任务
RecursiveTask<V>: ForkJoinTask子类,描述有返回值的任务
这个框架的策略是分而治之:将任务地柜划分成更小的子任务, 直到子任务足够小,从而能够被连续的处理掉为止
优点:处理过程中可以使用并行发生,这种情况特别适合基于多核处理器的并行编程。
下面就写一个小例子来演示下这个框架的应用:
import java.util.concurrent.ForkJoinPool;import java.util.concurrent.Future;import java.util.concurrent.RecursiveTask;/** * Fork/Join框架demo * Created by T430 on 2017/8/14. */public class ForkJoinDemo { private static int THRESLOD=1000;//任务阈值 /** * 求1到100万之间的和,因为需要返回结果,所以需要继承recursiverTask */ static class MC extends RecursiveTask<Long>{ Long sum = Long.valueOf(0); private int begin,end; public MC(int begin, int end){ this.begin=begin; this.end=end; } //表示这个任务完成后,返回的一个值 @Override protected Long compute() { //如果任务量小于阈值,就直接计算 if ((end-begin)<=THRESLOD){ for (int i = begin; i <end ; i++) { sum +=i; } }else{//如果大于1000, 就把他拆分成两个子任务进行fork int mid= (end+begin)/2; MC left=new MC(begin,mid);//一部分小线程 left.fork();//开启这小部分线程 MC right= new MC(mid,end); right.fork(); Long li= left.join();//让left任务完整完成 Long lr= right.join();//让right任务完整完成 sum=li+lr; } return sum; } } public static void main(String[] args) throws Exception{ ForkJoinPool forkJoinPool =new ForkJoinPool();//创建他的线程池 Future<Long> ft=forkJoinPool.submit(new MC(0,100001));//在线程池中进行计算 System.out.println("计算的结果是:"+ft.get()); forkJoinPool.shutdown();//关闭线程池 }}
第二个例子: 查询出数组里包含a的字段,并显示: 下面是demo
第一个:先重写
RecursiveTask<V>的抽象类
package ForkJoinTest;import java.util.concurrent.RecursiveTask;/** * 重写RecursiveTask<V>的抽象类 * Created by T430 on 2017/8/15. */public abstract class ForkJoinService<V> extends RecursiveTask<V> { @Override protected abstract V compute();}
第二步:
package ForkJoinTest;import java.util.ArrayList;import java.util.List;/** * ForkJoin的基类 * Created by T430 on 2017/8/15. */public class ForkJoinTest extends ForkJoinService<List<String>> { private int threshold;//阈值 private List<String> li;//待拆分list public ForkJoinTest(int threshold, List<String> li) { this.threshold = threshold; this.li = li; } @Override protected List<String> compute() { List<String> newList=new ArrayList<String>();//保存含有a字母的新集合 //当end与start之间的差小于阈值时,开始进行实际筛选 if (li.size()<threshold){ for (String s:li ) { if (s.contains("a")){//如果含有字母a,则添加进去 newList.add(s); }else{ continue; } } }else{ // 如果当end与start之间的差大于阈值时,将大任务分解成两个小任务。 int middles=li.size()/2; List<String> leftli= li.subList(0,middles); List<String> rightli=li.subList(middles,li.size()); ForkJoinTest left= new ForkJoinTest(threshold,leftli); ForkJoinTest right=new ForkJoinTest(threshold,rightli); //并行执行两个小任务 left.fork(); right.fork(); //把两个小任务的结果“集合”起来 newList.addAll(left.join()); newList.addAll(right.join()); } return newList; }}
第三步:测试:
package ForkJoinTest;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.concurrent.ExecutionException;import java.util.concurrent.ForkJoinPool;import java.util.concurrent.Future;/** * 测试类 * Created by T430 on 2017/8/15. */public class TestMain { public static void main(String[] args) throws ExecutionException, InterruptedException { String[] strings = {"a", "ah", "b", "ba", "ab", "ac", "sd", "fd", "ar", "te", "se", "te", "sdr", "gdf", "df", "fg", "gh", "oa", "ah", "qwe", "re", "ty", "ui", "al"}; List<String> stringList =new ArrayList<String>(Arrays.asList(strings));//把数组转换成list集合 ForkJoinPool forkJoinPool =new ForkJoinPool();//创建他的线程池 // 提交可分解的ForkJoinTask任务 Future<List<String>> ft=forkJoinPool.submit(new ForkJoinTest(20,stringList)); System.out.println("查询的结果是:"+ft.get()+",个数是:"+ft.get().size()); forkJoinPool.shutdown();//关闭线程池 }}
到处为止,Fork/Join框架就结束了, 大家对这个框架还有什么想深入了解的,具体的讲解呢, 推荐给大家:框架介绍,看下这个
阅读全文
0 0
- Fork/Join框架的简单学习和简单demo
- Java-Fork/Join的简单例子
- struts2框架的简单demo
- Java-Fork/Join的简单例子(入门)
- outer-join的简单学习
- Java多线程之~~~Fork/Join框架的同步和异步
- Android Volley框架的简单get和post demo
- 基于React,Webpack和Antd的简单框架Demo
- JDK1.7新特性(二)Fork/Join框架demo
- Glide框架的简单学习和理解
- Hook框架xposed的简单demo
- Hook框架xposed的简单demo
- 使用Java7提供的Fork/Join框架
- 使用Java7提供的Fork/Join框架
- Java里面的Fork/Join编程框架
- 浅谈Java的Fork/Join并发框架
- 浅谈Java的Fork/Join并发框架
- 浅谈Java的Fork/Join并发框架
- volatile和Cache一致性协议之MESI
- Ubuntu 17.04编译串口发送16进制数据包报了个神奇的错误—续
- Android IntentService 可执行耗时任务的Service
- HDU2034 人见人爱A-B
- 重要的Attach
- Fork/Join框架的简单学习和简单demo
- php文件下载
- 完美的代价
- 安装node.js之后的操作
- phpstorm:如何设置代码自动换行
- java集合之HashMap的扩容resize
- 大转盘游戏
- Maven+Spring+Spring MVC+MyBatis+MySQL整合SSM框架
- C++ Socket(二)