Fork/Join 框架是为了解决可以使用 divide 和 conquer 技术,使用 fork() 和 join() 操作把任务分成小块的问题而设计的。主要实现这个行为的是 ForkJoinPool 类。

本篇介绍从ForkJoinPool类可以获取的信息和如何获取这些信息。

1.   创建一个类,名为 Task, 扩展 RecursiveAction 类。

public class Task extends RecursiveAction {// 2. 声明一个私有 int array 属性,名为 array,用来储存你要增加的 array 的元素。private int[] array;// 3. 声明2个私有 int 属性,名为 start 和 end,用来储存 此任务已经处理的元素块的头和尾的位置。private int start;private int end;// 4. 实现类的构造函数,初始化属性值。public Task(int array[], int start, int end) {this.array = array;this.start = start;this.end = end;}// 5. 用任务的中心逻辑来实现 compute()// 方法。如果此任务已经处理了超过100任务,那么把元素集分成2部分,再创建2个任务分别来执行这些部分,使用 fork() 方法开始执行,并使用// join() 方法等待它的终结。protected void compute() {if (end - start > 100) {int mid = (start + end) / 2;Task task1 = new Task(array, start, mid);Task task2 = new Task(array, mid, end);task1.fork();task2.fork();task1.join();task2.join();// 6. 如果任务已经处理了100个元素或者更少,那么在每次操作之后让线程进入休眠5毫秒来增加元素。} else {for (int i = start; i < end; i++) {array[i]++;try {Thread.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}}}}
}

2. 创建例子的主类通过创建一个类,名为 Main 并添加 main()方法。

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.TimeUnit;public class Main {public static void main(String[] args) throws Exception {// 8. 创建 ForkJoinPool 对象,名为 pool。ForkJoinPool pool = new ForkJoinPool();// 9. 创建 10,000个元素的整数 array ,名为 array。int array[] = new int[10000];// 10. 创建新的 Task 对象来处理整个array。Task task1 = new Task(array, 0, array.length);// 11. 使用 execute() 方法 把任务发送到pool里执行。
        pool.execute(task1);// 12. 当任务还未结束执行,调用 showLog() 方法来把 ForkJoinPool 类的状态信息写入,然后让线程休眠一秒。while (!task1.isDone()) {showLog(pool);TimeUnit.SECONDS.sleep(1);}// 13. 使用 shutdown() 方法关闭pool。
        pool.shutdown();// 14. 使用 awaitTermination() 方法 等待pool的终结。pool.awaitTermination(1, TimeUnit.DAYS);// 15. 调用 showLog() 方法写关于 ForkJoinPool 类状态的信息并写一条信息到操控台表明结束程序。
        showLog(pool);System.out.printf("Main: End of the program.\n");}// 16. 实现 showLog() 方法。它接收 ForkJoinPool 对象作为参数和写关于线程和任务的执行的状态的信息。private static void showLog(ForkJoinPool pool) {System.out.printf("**********************\n");System.out.printf("Main: Fork/Join Pool log\n");System.out.printf("Main: Fork/Join Pool: Parallelism:%d\n",pool.getParallelism());System.out.printf("Main: Fork/Join Pool: Pool Size:%d\n",pool.getPoolSize());System.out.printf("Main: Fork/Join Pool: Active Thread Count:%d\n",pool.getActiveThreadCount());System.out.printf("Main: Fork/Join Pool: Running Thread Count:%d\n",pool.getRunningThreadCount());System.out.printf("Main: Fork/Join Pool: Queued Submission:%d\n",pool.getQueuedSubmissionCount());System.out.printf("Main: Fork/Join Pool: Queued Tasks:%d\n",pool.getQueuedTaskCount());System.out.printf("Main: Fork/Join Pool: Queued Submissions:%s\n",pool.hasQueuedSubmissions());System.out.printf("Main: Fork/Join Pool: Steal Count:%d\n",pool.getStealCount());System.out.printf("Main: Fork/Join Pool: Terminated :%s\n",pool.isTerminated());System.out.printf("**********************\n");}
}

上面代码示例使用了ForkJoinPool类中的以下方法:

  • getPoolSize(): 此方法返回 int 值,它是ForkJoinPool内部线程池的worker线程们的数量。
  • getParallelism(): 此方法返回池的并行的级别。
  • getActiveThreadCount(): 此方法返回当前执行任务的线程的数量。
  • getRunningThreadCount():此方法返回没有被任何同步机制阻塞的正在工作的线程。
  • getQueuedSubmissionCount(): 此方法返回已经提交给池还没有开始他们的执行的任务数。
  • getQueuedTaskCount(): 此方法返回已经提交给池已经开始他们的执行的任务数。
  • hasQueuedSubmissions(): 此方法返回 Boolean 值,表明这个池是否有queued任务还没有开始他们的执行。
  • getStealCount(): 此方法返回 long 值,worker 线程已经从另一个线程偷取到的时间数。
  • isTerminated(): 此方法返回 Boolean 值,表明 fork/join 池是否已经完成执行。

JUC组件扩展(二)-JAVA并行框架Fork/Join(四):监控Fork/Join池相关推荐

  1. JAVA并行框架:Fork/Join

    转载自 https://www.cnblogs.com/dongguacai/p/6021859.html JAVA并行框架:Fork/Join 一.背景 虽然目前处理器核心数已经发展到很大数目,但是 ...

  2. Java集合框架概述(四)——Map体系集合与底层实现原理

    一.Map父接口 1.概要 方法 描述 public interface Map<K,V> 将键映射到值的对象. 一个映射不能包含重复的键; 每个键可以映射到最多一个值.  将键映射到值的 ...

  3. Java集合框架之fastutil

    fastutil扩展了 Java集合框架,通过提供特定类型的map.set.list和queue,以及小内存占用.快速访问和插入:也提供大(64位)array.set 和 list,以及快速.实用的 ...

  4. 基于java spring框架开发部标1078视频监控平台精华文章索引

    部标1078视频监控平台,是一个庞杂的工程,涵盖了多层协议,部标jt808,jt809,jt1078,苏标Adas协议等,多个平台功能标准,部标796标准,部标1077标准和苏标主动安全标准,视频方面 ...

  5. JUC并发编程之Java线程(二)

    二.Java线程 2.1 创建和运行线程 方法一:Thread创建线程方式: 继承Thread类 匿名内部类方式 public class CreateThread01 {public static ...

  6. Java并行任务框架Fork/Join

    Fork/Join是什么? Fork意思是分叉,Join为合并.Fork/Join是一个将任务分割并行运行,然后将最终结果合并成为大任务的结果的框架,父任务可以分割成若干个子任务,子任务可以继续分割, ...

  7. shadowplay要下载java_Java并发程序设计(二)Java并行程序基础

    Java并行程序基础 一.线程的生命周期 其中blocked和waiting的区别: 作者:赵老师 链接:https://www.zhihu.com/question/27654579/answer/ ...

  8. 七、华为鸿蒙HarmonyOS应用开发之Java UI框架、常用Text组件和Button组件使用

    一.Java UI框架概述 应用的Ability在屏幕上将显示一个用户界面,该界面用来显示所有可被用户查看和交互的内容. 应用中所有的用户界面元素都是由Component和ComponentConta ...

  9. Java并发程序设计(二)Java并行程序基础

    Java并行程序基础 一.线程的生命周期 其中blocked和waiting的区别: 作者:赵老师 链接:https://www.zhihu.com/question/27654579/answer/ ...

最新文章

  1. 菜鸟刚入手Python第一天
  2. hdu 4524 郑厂长系列故事——逃离迷宫
  3. css类选择器类名覆盖优先级
  4. 中国大学moocpython笔记_中国大学MOOC_高级语言程序设计(Python)笔记
  5. quartus管脚分配后需要保存吗_电脑磁盘显示未分配怎么办?磁盘数据如何恢复?...
  6. Apache Hadoop下一代MapReduce框架(YARN)简介 (Apache Hadoop NextGen MapReduce (YARN))
  7. Centos7 操作系统 mysql5.7 配置远程登陆操作
  8. 【Antlr】WHITESPACE is not a recognized channel name
  9. [NLP]OpenNLP命名实体识别(NameFinder)的使用
  10. Python对文本文件的简单操作(一)
  11. C语言:判断一个三位数是否为水仙花数
  12. 有人喜欢有人嫉妒,竟然因为这上了互联网热搜
  13. wpf基于DevExpress实现折线图的两种方法
  14. Android-深色模式篇
  15. 电驴搜索服务器正在连接,电驴未连接到服务器是什么原因?
  16. 查看linux负载的情况
  17. vo bo po dao pojo dto
  18. 陪你云sdk用户指南
  19. 测试技术与信号处理实验报告
  20. echarts扇形图

热门文章

  1. PHP CodeBase: 判断用户是否手机访问
  2. 部署Ceph分布式高可用集群中篇
  3. 搭建大数据运行环境之一
  4. 第一节 Java语言发展史
  5. Centos8安装X11-forwarding图形服务
  6. github快速通道
  7. python设计模式20-状态模式
  8. android java 时间格式化_(Java / Android)计算两个日期之间的日期,并以特定格式显示结果...
  9. 基于centos6.5安装ElasticSearch
  10. 黄聪:PHP去掉转义后字符串中的反斜杠\函数stripslashes