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. JUC组件扩展(二)-JAVA并行框架Fork/Join(一):简介和代码示例

    一.背景 虽然目前处理器核心数已经发展到很大数目,但是按任务并发处理并不能完全充分的利用处理器资源,因为一般的应用程序没有那么多的并发处理任务.基于这种现状,考虑把一个任务拆分成多个单元,每个单元分别 ...

  2. JAVA并行框架:Fork/Join

    一.背景 虽然目前处理器核心数已经发展到很大数目,但是按任务并发处理并不能完全充分的利用处理器资源,因为一般的应用程序没有那么多的并发处理任务.基于这种现状,考虑把一个任务拆分成多个单元,每个单元分别 ...

  3. JAVA并行框架学习之ForkJoin

    当硬件处理能力不能按照摩尔定律垂直发展的时候,选择了水平发展,多核处理器已经广泛应用.未来随着技术的进一步发展,可能出现成百上千个处理核心,但现有的程序运行在多核心处理器上并不能得到较大性能的提升,主 ...

  4. JUC组件扩展(二)-JAVA并行框架Fork/Join(二):同步和异步

    在Fork/Join框架中,提交任务的时候,有同步和异步两种方式. invokeAll()的方法是同步的,也就是任务提交后,这个方法不会返回直到所有的任务都处理完了. fork方法是异步的.也就是你提 ...

  5. JUC组件扩展(二)-JAVA并行框架Fork/Join(三):在任务中抛出异常

    在java当中,异常一共分为两种.一种是运行时异常,一种是非运行是异常. 非运行时异常:这些异常必须在方法上通过throws子句抛出.或者在方法体内进行try{…}catch{…}来捕获异常. 运行时 ...

  6. JUC组件扩展(三):BlockingQueue(阻塞队列)详解

    一. 前言 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大 ...

  7. JUC组件扩展(一):FutureTask理解

    一.概述 FutureTask包装器是一种非常便利的机制,同时实现了Future和Runnable接口. 类图如下: FutureTask是一种可以取消的异步的计算任务.它的计算是通过Callable ...

  8. JavaEE-实验二 Java集合框架实验

    该博客仅专为我的小伙伴提供参考而附加,没空加上代码具体解析,望各位谅解 1.  使用类String类的分割split 将字符串  “Solutions to selected exercises ca ...

  9. 基于部标Jt/T809协议和Java Netty框架构建Gps位置监控平台

    现在地方上由于运输车辆的GPS数据都分散在地方上已有的各种企业平台上面,不利于大数据的分析和智能应用,而开发智能的基于大数据的Gps监控平台,往往需要和各种第三方的部标GPS监控平台对接,获取到第三方 ...

随机推荐

  1. CentOS 6.9下配置安装KVM

    注意:KVM一切安装和运行都是在root用户下完成的,并且只有root才能支持某些软件. 一.准备工作: 1.查看系统版本.内核版本 ##查看系统版本 # cat /etc/redhat-releas ...

  2. Vue 小项目的最佳实践

    项目简介 目前一期只是为App内某个模块资讯模块文章的分享和APP下载,后续还会有更多的功能,为了项目可扩展.可伸缩结合了我以前的实践搭建了此项目项目地址,如果这个简单的项目能给您带来帮助请给小哥哥⭐ ...

  3. Linux 的硬链接与软链接

    Linux 的硬链接与软链接    http://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/    若一个 inode 号对 ...

  4. cpu个数、核数、线程数、Java多线程关系的理解

    cpu个数.核数.线程数.Java多线程关系的理解 2017年12月08日 15:35:37 一 cpu个数.核数.线程数的关系 cpu个数:是指物理上,也及硬件上的核心数: 核数:是逻辑上的,简单理 ...

  5. leetcoder-50-Pow(x, n)

    Pow(x, n) 能够直接用库函数pow(x,n)一步搞定,但明显这样就没意思了.   參考   快 速 幂 取 模 二分.复杂度为O(logn) 递归方法 class Solution { pub ...

  6. Linux中线程使用详解

    线程与进程为什么有了进程的概念后,还要再引入线程呢?使用多线程到底有哪些好处?什么的系统应该选用多线程?我们首先必须回答这些问题. 使用多线程的理由之一是和进程相比,它是一种非常"节俭&qu ...

  7. PhpStorm 对 AngularJS 的支持

    非常喜爱用AngularJS来构建web应用程序的前端吗? PhpStorm 使得在其上进行 AngularJS 相关的工作同其它得到IDE支持的编程语言的工作一样容易! AD:51CTO首届中国AP ...

  8. http://my.oschina.net/u/1177710/blog/284608

    http://my.oschina.net/u/1177710/blog/284608 http://chuhanzhi.com/?p=45 http://www.2cto.com/kf/201501 ...

  9. VB6.0 中 碰到 提示rs对象关闭,不允许操作, 吃一堑长一智

    VB6.0 中 碰到 提示rs对象关闭,不允许操作,  吃一堑长一智 如果碰到 这个错误提示 则请检查 你执行的每一个语句中的数据类型,包括 如果有存储过程的话,还要检查 存储过程中每一个变量和数据表 ...

  10. [Python爬虫] Selenium +phantomjs 模拟下拉滚动条

    在爬虫中,有时会遇到这种情况,数据的展示是不是一页一页的,而是通过不断的下拉滚动条来加载数据.例如一点咨询(http://www.yidianzixun.com/)和微博(在未登录的状态下:http: ...