文档章节

Java并行程序基础(七)

1527
 1527
发布于 2017/03/28 22:15
字数 432
阅读 12
收藏 0
  • Fork/Join框架

在jdk中,给出了一个ForkJoinPool线程池,对于fork()方法并不着急开启线程,而是提交给ForkJoinPool线程池进行处理,以节省系统资源。使用Fork/Join进行数据处理时的总体结构如图:

                                                          Fork/join执行逻辑

线程A已经把自己的任务都执行完成了,而线程B还有一堆任务等着处理,此时,线程A就会帮助线程B,从线程B的任务队列中拿一个任务过来处理,尽可能达到平衡。上图显示了这种互相帮助的精神。当线程试图帮助别人时,总是从任务队列的底部开始拿数据,而线程试图执行自己的任务时,则是从相反的顶部开始拿。因此这种行为也十分有利于避免数据竞争。

ForkJoinPool有一个重要的接口:

public <T> ForkJoinTask<T> submit(ForkJoinTask<T> task)

ForkJoinTask有两个重要的子类,RecursiveAction和RecursiveTask,他们分别表示没有返回值的任务和可以携带返回值的任务。

package com.thread.t02;

import java.util.ArrayList;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;

public class CountTask extends RecursiveTask<Long>{

	private static final int THRESHOLD=10000;
	private long start;
	private long end;
	
	public CountTask(long start, long end) {
		super();
		this.start = start;
		this.end = end;
	}


	@Override
	protected Long compute() {
		long sum=0;
		boolean canCompute = (end-start)<THRESHOLD;
		if(canCompute){
			for (long i = start; i <=end; i++) {
				sum+=i;
			}
		}else{
			long step = (start+end)/100;
			ArrayList<CountTask> subTasks = new ArrayList<>();
			long pos = start;
			for(int i=0;i<100;i++){
				long lastOne = pos+step;
				if(lastOne>end) lastOne=end;
				CountTask subTask = new CountTask(pos, lastOne);
				pos+=step+1;
				subTasks.add(subTask);
				subTask.fork();
			}
			for(CountTask t:subTasks){
				sum+=t.join();
			}
		}
		return sum;
	}

	public static void main(String[] args) {
		ForkJoinPool forkJoinPool = new ForkJoinPool();
		CountTask task = new CountTask(0, 20000L);
		ForkJoinTask<Long> result = forkJoinPool.submit(task);
		
		long res;
		try {
			res = result.get();
			System.out.println("sum="+res);
		} catch (InterruptedException | ExecutionException e) {
			e.printStackTrace();
		}
		
	}
}

 

 

 

 

 

 

 

                                             

 

© 著作权归作者所有

1527

1527

粉丝 9
博文 113
码字总数 45785
作品 0
成都
程序员
私信 提问
Java 与 F# 的并行程序处理对比

Azul System的Cliff Click博士是多核心JVM系统方面的专家,之前发表了一篇博文,首先比较了Java与C语言和C++的性能表现,但同时也讨论了C#和.NET。以下三个Cliffs博士的评论让人十分感兴趣:...

彭博
2012/03/09
3.4K
35
OSC 第 101 期高手问答 —— Java 高并发程序设计

OSCHINA 本期高手问答(12月02日- 12月08日)我们请来了《实战Java高并发程序设计》的作者 @葛一鸣 为大家解答关于 Java 的并行程序设计基础、思路、方法和实战 方面的问题。如: 现在的服务...

叶秀兰
2015/12/01
13K
84
你所需要的java提升篇大总结

java基础篇深入解析大总结 java基础(一) 深入解析基本类型 java基础(二) 自增自减与贪心规则 java基础(三) 加强型for循环与Iterator java基础(四) java运算顺序的深入解析 java基础(五) Str...

sihailoveyan
2018/04/25
0
0
Java程序员从笨鸟到菜鸟全部博客目录【2012年十一月七日更新】

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188 大学上了一年半,接触java也一年半了,虽然中间也有其他东西的学习,但是还是以java为主路线,想想这一年半,...

长平狐
2012/11/12
219
0
《Java程序员由笨鸟到菜鸟》电子版书正式发布,欢迎大家下载

在众多朋友的支持和鼓励下,《Java程序员由菜鸟到笨鸟》电子版终于和大家见面了。本电子书涵盖了从java基础到javaweb开放框架的大部分内容。在编写的过程中,难免会出现一些错误,希望大家能...

长平狐
2012/11/12
265
0

没有更多内容

加载失败,请刷新页面

加载更多

总结

一、设计模式 简单工厂:一个简单而且比较杂的工厂,可以创建任何对象给你 复杂工厂:先创建一种基础类型的工厂接口,然后各自集成实现这个接口,但是每个工厂都是这个基础类的扩展分类,spr...

BobwithB
29分钟前
2
0
java内存模型

前言 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模...

ls_cherish
33分钟前
2
0
友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
5
0
JAVA 利用时间戳来判断TOKEN是否过期

import java.time.Instant;import java.time.LocalDateTime;import java.time.ZoneId;import java.time.ZoneOffset;import java.time.format.DateTimeFormatter;/** * @descri......

huangkejie
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部