• Java并发Fork-Join框架原理解析


    1、什么是Foirk/Join框架

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

    2、什么是并行流与顺序流

    2.1  什么是并行流?

    并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流

    2.2  工作窃取模式

    某个线程从其他队列里窃取任务来执行,

    3、使用Fork/Join框架

    /**
     *	累加运算测试
     */
    public class ForkJoinCalculate extends RecursiveTask<Long> {
    
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 7125244951292834932L;
    	
    	private long start;// 起始值
    	private long end;// 结束值
    	private static final long THRESHOLD = 10000L;// 临界值
    
    	@Override
    	protected Long compute() {
    		long length = end - start;
    		
    		if(length <= THRESHOLD) {
    			long sum = 0L;
    			
    			for (long i = start; i <= end; i++) {
    				sum += i;
    			}
    			
    			return sum;
    		}else {
    			long middle = (start + end) / 2;// 中间值
    			
    			ForkJoinCalculate left = new ForkJoinCalculate(start, middle);// 0-50000000
    			left.fork();// 拆分子任务,同时压入线程队列
    			ForkJoinCalculate right = new ForkJoinCalculate(middle + 1, end);// 50000001-100000000
    			right.fork();// 拆分子任务,同时压入线程队列
    			
    			return left.join() + right.join();// 汇总任务结果
    		}
    	}
    	
    	public ForkJoinCalculate() {
    	}
    
    	public ForkJoinCalculate(long start, long end) {
    		this.start = start;
    		this.end = end;
    	}
    }
    

    4、Java8中的并行流和顺序流

    4.1 顺序流

    /**
    	 * Java8的顺序流
    	 */
    	@Test
    	public void test3() {
    		Instant start = Instant.now();// java8中新时间日期API
    		
    		LongStream.rangeClosed(0, 10000000000L)
    					.sequential()// 顺序流
    					.reduce(0, Long::sum);
    		
    		Instant end = Instant.now();
    		
    		// 5780
    		System.out.println("耗费时间为:" + Duration.between(start, end).toMillis());// java8中新时间日期API
    	}
    

      

    4.2  并行流

    /**
    	 * Java8的并行流
    	 */
    	@Test
    	public void test4() {
    		Instant start = Instant.now();// java8中新时间日期API
    		
    		LongStream.rangeClosed(0, 10000000000L)
    					.parallel()// 并行流
    					.reduce(0, Long::sum);
    		
    		Instant end = Instant.now();
    		
    		// 2392
    		System.out.println("耗费时间为:" + Duration.between(start, end).toMillis());// java8中新时间日期API
    	}
    

      

     

  • 相关阅读:
    弃用!Github 上用了 Git.io 缩址服务的都注意了
    创建一个unicloud项目步骤
    win10 文件夹右键卡死解决办法
    微信公众号微信CRM和公众号管理软件 侯斯特
    openlayer,地图底图白色 修改为深色显示
    WPF 通用权限开发框架 (ABP)
    chromuim内核video audio标签自动播放
    字符串,16进制互转
    虚拟机VMware16+Ubuntu20.04配置LOAMLIVOX
    curl centos 使用详解
  • 原文地址:https://www.cnblogs.com/Jansens520/p/7804053.html
Copyright © 2020-2023  润新知