Fork/Join框架介绍

下面使用该框架计算0-50000000000的和,并比较普通计算方法、Fork/Join框架、Java8新特性三种计算方式的计算时间:

  1. import java.time.Duration;
  2. import java.time.Instant;
  3. import java.util.concurrent.ForkJoinPool;
  4. import java.util.concurrent.ForkJoinTask;
  5. import java.util.concurrent.RecursiveTask;
  6. import java.util.stream.LongStream;
  7.  
  8. import org.junit.Test;
  9.  
  10. public class TestForkJoinPool {
  11.  
  12. public static void main(String[] args) {
  13. Instant start = Instant.now();
  14. ForkJoinPool pool = new ForkJoinPool();
  15. ForkJoinTask<Long> task = new ForkJoinSumCalculate(0L, 50000000000L);
  16. Long sum = pool.invoke(task);
  17. System.out.println(sum);
  18. Instant end = Instant.now();
  19. System.out.println("耗费时间为:" + Duration.between(start, end).toMillis());//
  20. }
  21.  
  22. @Test
  23. public void test1(){
  24. Instant start = Instant.now();
  25. long sum = 0L;
  26. for (long i = 0L; i <= 50000000000L; i++) {
  27. sum += i;
  28. }
  29. System.out.println(sum);
  30. Instant end = Instant.now();
  31. System.out.println("耗费时间为:" + Duration.between(start, end).toMillis());//
  32. }
  33.  
  34. //java8 新特性
  35. @Test
  36. public void test2(){
  37. Instant start = Instant.now();
  38. Long sum = LongStream.rangeClosed(0L, 50000000000L)
  39. .parallel()
  40. .reduce(0L, Long::sum);
  41. System.out.println(sum);
  42. Instant end = Instant.now();
  43. System.out.println("耗费时间为:" + Duration.between(start, end).toMillis());//
  44. }
  45. }
  46.  
  47. class ForkJoinSumCalculate extends RecursiveTask<Long>{
  48.  
  49. private static final long serialVersionUID = -259195479995561737L;
  50.  
  51. private long start;
  52. private long end;
  53. private static final long THURSHOLD = 10000L; //临界值
  54. public ForkJoinSumCalculate(long start, long end) {
  55. this.start = start;
  56. this.end = end;
  57. }
  58.  
  59. @Override
  60. protected Long compute() {
  61. long length = end - start;
  62. if(length <= THURSHOLD){
  63. long sum = 0L;
  64. for (long i = start; i <= end; i++) {
  65. sum += i;
  66. }
  67. return sum;
  68. }else{
  69. long middle = (start + end) / 2;
  70. ForkJoinSumCalculate left = new ForkJoinSumCalculate(start, middle);
  71. left.fork(); //进行拆分,同时压入线程队列
  72. ForkJoinSumCalculate right = new ForkJoinSumCalculate(middle+1, end);
  73. right.fork(); //
  74. return left.join() + right.join();
  75. }
  76. }
  77. }

转载自:http://blog.csdn.net/xiangwanpeng/article/details/54977709

【转】Fork/Join框架测试的更多相关文章

  1. JAVA中的Fork/Join框架

    看了下Java Tutorials中的fork/join章节,整理下. 什么是fork/join框架 fork/join框架是ExecutorService接口的一个实现,可以帮助开发人员充分利用多核 ...

  2. Fork/Join 框架-设计与实现(翻译自论文《A Java Fork/Join Framework》原作者 Doug Lea)

    作者简介 Dong Lea任职于纽约州立大学奥斯威戈分校(State University of New York at Oswego),他发布了第一个广泛使用的java collections框架实 ...

  3. Fork/Join 框架框架使用

    1.介绍 Fork/Join 框架是 Java7 提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架.在多核计算机中正确使用可以很好的 ...

  4. 013-多线程-基础-Fork/Join框架、parallelStream讲解

    一.概述 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架. 它同ThreadPoolExecut ...

  5. Java 并发之 Fork/Join 框架

    什么是 Fork/Join 框架 Fork/Join 框架是一种在 JDk 7 引入的线程池,用于并行执行把一个大任务拆成多个小任务并行执行,最终汇总每个小任务结果得到大任务结果的特殊任务.通过其命名 ...

  6. 聊聊并发(八)——Fork/Join框架介绍

      作者 方腾飞 发布于 2013年12月23日 | 被首富的“一个亿”刷屏?不如定个小目标,先把握住QCon上海的优惠吧!2 讨论 分享到:微博微信FacebookTwitter有道云笔记邮件分享 ...

  7. JDK7新特性之fork/join框架

    The fork/join framework is an implementation of the ExecutorService interface that helps you take ad ...

  8. Java并发——Fork/Join框架

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/4631466. ...

  9. 转:聊聊并发(八)——Fork/Join框架介绍

    1. 什么是Fork/Join框架 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架. 我们再通过 ...

随机推荐

  1. centos6.8安装zabbix

    前后用了两台电脑来实验,前后画风不一样,请忽略 一.安装php环境 移除目前系统安装的 PHP 组件 yum remove php* -y 安装 PHP 的 YUM 源  rpm -Uvh http: ...

  2. Jenkins的权限控制和Rundeck的远程认证

    1.权限控制的基本设置 1.1选择基于角色权限的分配策略 1.2 配置全局权限和项目权限 具体的权限对应关系见下表: Overall(全局) Credentials(凭证) Slave(节点) Job ...

  3. 2017浙江省赛 H - Binary Tree Restoring ZOJ - 3965

    地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3965 题目: iven two depth-first-search ...

  4. eclipse调试程序界面简单介绍使用

    右键程序  Debug 运行后  如下图:

  5. nodejs做中间层,向后端取数据

    var  http=require('http'): http.get('http://baidu/dksapi/weiboLive/GetSquareLive?pagecount=1&pag ...

  6. 对称加密与非对称加密,以及RSA的原理

    一 , 概述 在现代密码学诞生以前,就已经有很多的加密方法了.例如,最古老的斯巴达加密棒,广泛应用于公元前7世纪的古希腊.16世纪意大利数学家卡尔达诺发明的栅格密码,基于单表代换的凯撒密码.猪圈密码, ...

  7. [one day one question] Iscroll 5.0 在chrome上无法滑动

    问题描述: Iscroll 5.0 在chrome上无法滑动,不仅仅在chromePC的开发的时候,在手机上的chrome也有同样的问题,这怎么破? 解决方案: // 关闭 PointerEvent ...

  8. XPO开发指南简要

    一.XPO简介: XPO即eXpress Persistent Objects for .NET,现在这里介绍的版本是1.5. XPO在应用程序代码和数据库之间扮演了一个中间层的角色,简单而言,就是将 ...

  9. https nginx配置

    cd /saas/conf/nginx/ mkdir key cd key 创建key: openssl req -nodes -newkey rsa:2048 -keyout server.key ...

  10. yield生成器函数

    生成器有主要有四种方法: next() 执行函数,直到遇到下一个yield为止,并返回值 send(value) 为生成器发送一个数值,next()方法就相当于send(None) close() 终 ...