栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

ForkJoin

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

ForkJoin

Java 7开始引入了一种新的Fork/Join线程池,它可以执行一种特殊的任务:把一个大任务拆成多个小任务并行执行。

工作窃取(work-stealing)算法是指某个线程从其他队列里窃取任务来执行。

 那么为什么需要使用工作窃取算法呢?假如我们需要做一个比较大的任务,我们可以把这个任务分割为若干互不依赖的子任务,为了减少线程间的竞争,于是把这些子任务分别放到不同的队列里,并为每个队列创建一个单独的线程来执行队列里的任务,线程和队列一一对应,比如A线程负责处理A队列里的任务。但是有的线程会先把自己队列里的任务干完,而其他线程对应的队列里还有任务等待处理。干完活的线程与其等着,不如去帮其他线程干活,于是它就去其他线程的队列里窃取一个任务来执行。而在这时它们会访问同一个队列,所以为了减少窃取任务线程和被窃取任务线程之间的竞争,通常会使用双端队列,被窃取任务线程永远从双端队列的头部拿任务执行,而窃取任务的线程永远从双端队列的尾部拿任务执行。


ForkJoinPool

        Java提供了ForkJoinPool来支持将一个任务拆分成多个“小任务”并行计算,再把多个“小任务”的结果合成总的计算结果。

        ForkJoinPool是ExecutorService的实现类,因此是一种特殊的线程池。ForkJoinPool提供了如下两个常用的构造器。

     public ForkJoinPool(int parallelism):创建一个包含parallelism个并行线程的ForkJoinPool
     public ForkJoinPool() :以Runtime.getRuntime().availableProcessors()的返回值作为parallelism来创建ForkJoinPool

         创建ForkJoinPool实例后,可以钓鱼ForkJoinPool的submit(ForkJoinTask task)或者invoke(ForkJoinTask task)来执行指定任务。其中ForkJoinTask代表一个可以并行、合并的任务。ForkJoinTask是一个抽象类,它有两个抽象子类:RecursiveAction和RecursiveTask。

    RecursiveTask代表有返回值的任务
    RecursiveAction代表没有返回值的任务。
 

ForkJoin计算1+2+3+...+100

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

class MyTask extends RecursiveTask{
	
	private static final int value=10;
	
	private int result=0;
	private int begin;
	private int end;
	private int middle;
	
	public MyTask(int begin,int end) {
		this.begin=begin;
		this.end=end;
	}

	@Override
	protected Integer compute() {

		if(end-begin<=value) {
			for(int i=begin;i<=end;i++) {
				result+=i;
			}
		}else {
			middle=(begin+end)/2;
			MyTask task1=new MyTask(begin,middle);
			MyTask task2=new MyTask(middle+1,end);
			task1.fork();
			task2.fork();
			result=task1.join()+task2.join();
		}		
		return result;
	}
	
}

public class ForkJoinDemo {

	public static void main(String[] args) {
		MyTask task=new MyTask(0,100);
		ForkJoinPool pool=new ForkJoinPool();
		ForkJoinTask submit = pool.submit(task);
		Integer result=null;
		try {
			result = submit.get();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ExecutionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		pool.shutdown();
		System.out.println(result);
	}

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/584871.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号