九、JDK1.8—并行流与串行流

2023-11-16

并行流

并行流就是把一个内容分成多个数据块,并用不同的线程分 别处理每个数据块的流。
Java 8 中将并行进行了优化,我们可以很容易的对数据进行并 行操作。Stream API 可以声明性地通过 parallel() 与 sequential() 在并行流与顺序流之间进行切换。

 Fork/Join 框架

Fork/Join 框架:就是在必要的情况下,将一个大任务,进行拆分(fork)成若干个小任务(拆到不可再拆时),再将一个个的小任务运算的结果进行 join 汇总.

 

 传统线程池的不足之处

比如一百个线程,被平均分配到了4个cpu(1,2,3,4)上,假设4个线程在执行任务过程中,1和2上的线程执行第一个线程的时候阻塞了,而3和4上的线程快速执行完了,此时1和2也过了阻塞,这样造成了3和4的空闲,1和2繁忙,造成了cpu资源的浪费

Fork/Join 框架与传统线程池的区别

采用 “工作窃取”模式(work-stealing):
当执行新的任务时它可以将其拆分分成更小的任务执行,并将小任务加到线程队列中,然后再从一个随机线程的队列中偷一个并把它放在自己的队列中。相对于一般的线程池实现,fork/join框架的优势体现在对其中包含的任务的处理方式上.在一般的线程池中,如果一个线程正在执行的任务由于某些原因无法继续运行,那么该线程会处于等待状态.而在fork/join框架实现中,如果某个子问题由于等待另外一个子问题的完成而无法继续运行.那么处理该子问题的线程会主动寻找其他尚未运行的子问题来执行.这种方式减少了线程的等待时间,提高了性能.

通过以下三个方法计算0到100亿的和体验一下fork/join框架

public class ForkJoinCalculate extends RecursiveTask<Long>{

	/**
	 * 
	 */
	private static final long serialVersionUID = 13475679780L;
	
	private long start;
	private long end;
	
	private static final long THRESHOLD = 10000L; //临界值
	
	public ForkJoinCalculate(long start, long end) {
		this.start = start;
		this.end = end;
	}
	
	@Override
	protected Long compute() {
		long length = end - start;
		
		if(length <= THRESHOLD){
			long sum = 0;
			
			for (long i = start; i <= end; i++) {
				sum += i;
			}
			
			return sum;
		}else{
			long middle = (start + end) / 2;
			
			ForkJoinCalculate left = new ForkJoinCalculate(start, middle);
			left.fork(); //拆分,并将该子任务压入线程队列
			
			ForkJoinCalculate right = new ForkJoinCalculate(middle+1, end);
			right.fork();
			
			return left.join() + right.join();
		}
		
	}

}
public class TestForkJoin {

	@Test//普通方法
	public void test2() {
		long start = System.currentTimeMillis();

		long sum = 0L;

		for (long i = 0L; i <= 10000000000L; i++) {
			sum += i;
		}

		System.out.println(sum);

		long end = System.currentTimeMillis();

		System.out.println("耗费的时间为: " + (end - start));
	}
	
	@Test//1.8之前的fork/join框架
	public void test1(){
		long start = System.currentTimeMillis();
		
		ForkJoinPool pool = new ForkJoinPool();
		ForkJoinTask<Long> task = new ForkJoinCalculate(0L, 10000000000L);
		
		long sum = pool.invoke(task);
		System.out.println(sum);
		
		long end = System.currentTimeMillis();
		
		System.out.println("耗费的时间为: " + (end - start));
	}

	
	@Test//1.8之后的fork/join框架
	public void test3(){
		long start = System.currentTimeMillis();
		
		Long sum = LongStream.rangeClosed(0L, 10000000000L)
							 .parallel()//切换到并行流
							 .sum();
		
		System.out.println(sum);
		
		long end = System.currentTimeMillis();
		
		System.out.println("耗费的时间为: " + (end - start));
	}

}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

九、JDK1.8—并行流与串行流 的相关文章

  • 【OpenGL进阶】01.使用Shader绘制三角形

    在前一个阶段的文章中 主要是使用OpenGL的固定管线来实现了一系列的操作 内容并不复杂 十分好理解 接下来的进阶系列中 我们将使用shader代码来实现一些效果 首先通过shader来实现一个三角形的绘制 首先来看main cs 创建窗口
  • 老域名扫描软件-老域名采集挖掘工具

    老域名挖掘软件 老域名挖掘软件是一种可以帮助用户发现已过期或未续费的老域名的工具 以下是该软件主要特点 大数据分析 该软件通过大数据分析技术 深度挖掘互联网上的闲置老域名 发现可用的未续费或已过期域名 从而为用户提供更多的域名选择 全网搜索
  • Android studio 3.2 升级详解及Gradle配置

    一直在使用Android studio 2 3 1版本 因为工作开发使用的都是这个版本 所以在经历了N次提示更新后 依旧还是没有升级 直到今天终于忍不住了 因为Android Studio 3 2版本在这个月发布了 增加了很多新特性 具体参
  • halcon 测量

    dev set draw margin dev set line width 3 创建包含了检测的边缘ROI区域 注意所画的矩形区域的长轴要与检测边界垂直 Row 599 5 Column 1073 5 Phi rad 87 0643 Le
  • oracle number17,2018-10-17 oracle 常用语法函数总结

    1 Oracle正则匹配使用 PS 这条SQL可以通过正则匹对查询一下 表A的字段a是否有非数字的数据 有时候数据表的一些字段是varchar类型的 如果sql里用to number的话 就肯定会报无效数字的错误 select from 表
  • VS2008下的配置opencv

    openCV 2 2以及2 2以下版本 不自带编译好的dll动态库和lib静态库文件 其中的bin和lib都是未经编译的 还不能直接使用的 因此需要进行下载CMake来对于Opencv源代码进行重新编译 才能得到最终的dll和lib库文件
  • 本人亲自整理的极客时间设计模式之美下部的硬核笔记(残缺版)最近加班太多,搞不了太多,只能尽量了xd们

    设计模式之美 下 https www yuque com zcming123 uygxde cbwnad 这位猿 三连 再走吧 以下内容是为了让搜索引擎 检测到这篇文章 要阅读体验 请点击上面的连接 点击我 去我的语雀看 对了 我看到语雀那
  • Spring Boot 基础知识

    概述 什么是 Spring Boot Spring Boot 是 Spring 开源组织下的子项目 是 Spring 组件一站式解决方案 主要是简化了使用 Spring 的难度 简省了繁重的配置 提供了各种启动器 开发者能快速上手 Spri
  • STM32F103系列定时器通道对应IO汇总

    1 通用定时器 TIM2 Default Remap CH1 ETR PA0 PA15 CH2 PA1 PB3 CH3 PA2 PB10 CH4 PA3 PB11 TIM3 Default Remap CH1 PA6 PB4 PC6 CH2
  • 在Windows服务器上搭建Nuget私人服务器(超~详细)

    在Windows服务器上搭建Nuget私人服务器 一 使用VS2017 VS2019新建空白解决方案 操作如图 步骤一 这里以VS2019为例 打开VS2019 选择 创建新项目 选项 步骤二 选择 空白解决方案 点击 下一步 步骤三 填写
  • React中setState()更新状态的两种写法及相关问题

    1 setState updater callback 函数式的setState updater是一个返回stateChange对象的函数 如下代码所示 它接收的state和props都保证为最新 updater的返回值会与state进行浅
  • 关于Socket编程中的inet_ntop、inet_pton和inet_ntoa、inet_addr

    VS2013中调试Socket代码时 遇到了点小问题 问题代码为 cpp view plain copy inet ntoa addrClient sin addr 生成错误消息为 plain view plain copy error C
  • Spark中的基本概念

    Spark中的基本概念 1 基本概念 1 1 RDD 弹性分布式数据集 1 2 DAG 有向无环图 1 3 Partition 数据分区 1 4 NarrowDependency 窄依赖 1 5 ShuffleDependency 宽依赖
  • 互斥锁,自旋锁,原子操作的原理,区别和实现

    一 互斥锁 原理 互斥锁属于sleep waiting类型的锁 例如在一个双核的机器上有两个线程 线程A和线程B 它们分别运行在Core0和Core1上 假设线程A想要通过pthread mutex lock操作去得到一个临界区的锁 而此时
  • windows系统软件开发平台配置

    1 mongodb安装及配置 参考文档 https blog csdn net xuforeverlove article details 88344213 1 1 临时启动mongodb服务 a 打开mongodb安装文件夹 进入并复制d
  • 【七夕活动精选】致你的七夕礼物——3D Heart,跳动的 3D 爱心

    程序效果很简单 是一颗跳动的爱心 在心脏下面有一行小字写着 七夕快乐 按住鼠标左键并拖动可以让它旋转起来 按住右键可以让这颗心暂时停止跳动 执行效果如下 完整的源代码如下 程序名称 致你的七夕礼物 3D Heart 编译环境 Visual
  • sqli-labs 41——65关攻略

    Less 41 基于错误的POST型单引号字符型注入 与之前讲的Less 40的区别 s q l S E L E C T F R O M u s e r s W H E R E i d sql SELECT FROM users WHERE
  • 2023年华中杯选题人数公布

    2023年华中杯选题人数公布 经过一晚上代码的编写 论文的写作 C题完整版论文已经发布 注 蓝色字体为说明备注解释字体 不能出现在大家的论文里 黑色字体为论文部分 大家可以根据红色字体的注记进行摘抄 对应的详细的写作视频教程 争取1号晚上发
  • [机器学习笔记] 支持向量机SVM 和逻辑回归LR的异同

    参考 https www cnblogs com zhizhan p 5038747 html 为什么把SVM和LR放在一起进行比较 一是因为这两个模型应用广泛 二是因为这两个模型有很多相同点 在使用时容易混淆 不知道用哪个好 特别是对初学

随机推荐

  • 性能测试-压力测试-jmeter简单实战

    文章目录 一 压力测试 1 性能指标 响应时间 RT HPS Hits Per second TPS Transaction Per second QPS Query Per second 最大响应时间 Max Response Time
  • oracle如何提高数据库的性能和可用性

    进行数据库优化 通过定期执行优化操作 如维护索引 调整内存参数 优化 SQL 语句等 可以提高数据库的性能和可用性 执行数据库碎片整理 通过执行表空间碎片整理 索引碎片整理 表碎片整理等操作 可以优化数据库的碎片 提高数据存储效率 执行数据
  • ruoyi对数据二次处理后分页失效

    业务场景 正常业务场景下 在service层只做一次查询就能满足需求 若需要分页 只需在Controller层添加继承BaseController 使用startPage 和getDataTable 即可 业务需求存在需要对查询的数据做二次
  • SpringCloud 服务保护机制Hystrix

    微服务高可用技术 大型复杂的分布式系统中 高可用相关的技术架构非常重要 高可用架构非常重要的一个环节 就是如何将分布式系统中的各个服务打造成高可用的服务 从而足以应对分布式系统环境中的各种各样的问题 避免整个分布式系统被某个服务的故障给拖垮
  • Unity中的C#与C++交互

    参考 Unity Manual Low level Native Plugin Interface 源码demo 演示了一个渲染三角形的例子 C 部分代码实现了对底层API的封装以及核心功能实现 RenderingPlugin cpp中定义
  • 记一次Gradle构建项目Cannot locate tasks that match ‘:xxxx‘ as task ‘xxx‘ not found in root project ‘xxxx‘错误

    问题 在使用Gradle构建项目时 遇见了一个奇怪的问题 运行报错如下 Cannot locate tasks that match xxxx as task xxx not found in root project xxxx 思路 单看
  • Linux基础学习笔记之——软件安装:源码与Tarball

    软件安装 源码与Tarball 1 开放源码的软件安装与升级简介 Linux 上面的软件几乎都是经过 GPL 的授权 所以每个软件几乎均提供源码 并且你可以自行修改该程序代码 以符合个人的需求 这就是开放源码的优点 1 1 什么是开放源码
  • 腾讯事务处理技术验证系统3TS-Coo模板安装文档&&说明文档(小白向,简单轻松就能上手)

    本篇文章将详细说明3TS Coo模板的安装和使用 帮助您快速上手项目 第一部分是简单的基础Docker相关概念 精炼的几句小白话快速理解即可 第二部分是快速安装项目环境的安装文档 简单几行命令搞定 小白也能轻松上手 第三部分是对于已经安装的
  • jupter notebook代码无法执行,出现in[*]的解决办法

    In 数字 代表已经执行的代码 其中数字代表可执行的代码编号 解决办法 点击Kernel中的Restart Run all 重新执行全部代码 系统会从In 1 依次执行 并且报错 我们一直改错即可 直至In 变为In 数字 即可
  • 使用Python爬虫和数据可视化,揭示人口大国历年人数的变迁

    前言 人口大国通常在全球人口排名中位居前列 其人口数量远远超过其他国家 而印度和中国这两个国家的人口数量均已经超过14亿 而当前全球的人口总数也不过刚刚突破80亿而已 妥妥的天花板级别存在 或许是中国和印度在人口方面的表现太过 耀眼 以至于
  • 「学习笔记」torchvision.datasets.MNIST 参数解读/中文使用手册

    DataLoader使用手册 参数解读 PyTorch torch utils data DataLoader 中文使用手册 官方手册如下 torchvision datasets MNIST root train True transfo
  • vue开发:前端项目模板

    简介 vue cli创建vue项目 整合vuex vue router axios element ui 项目模板下载地址 创建项目 Java 前端项目合集 使用vue cli创建项目 功能选择 Babel Router vuex Lint
  • HJ67 24点游戏算法

    问题描述 给出4个1 10的数字 通过加减乘除 得到数字为24就算胜利 输入 本题含有多组样例输入 4个1 10的数字 数字允许重复 但每个数字仅允许使用一次 测试用例保证无异常数字 输出 true or false 示例 输入 7 2 1
  • CRC的基本原理详解

    CRC Cyclic Redundancy Check 被广泛用于数据通信过程中的差错检测 具有很强的 检错能力 本文详细介绍了CRC的基本原理 并且按照解释通行的查表算法的由来的思路介绍 了各种具体的实现方法 1 差错检测 数据通信中 接
  • mybatisplus多条件并列复杂查询

    在使用mybatisPlus时 有时需要一些负责的sql条件拼接 这时 我们可以利用 QueryWrapper的and Consumer consumer 和 or Consumer consumer 来对条件进行拼接 查询条件拼接 例如
  • 配置AOP时报错:java.lang.ClassCastException: com.sun.proxy.$Proxy2 cannot be cast to

    报错 Exception in thread main java lang ClassCastException com sun proxy Proxy2 cannot be cast to 看报错信息 显示的是动态代理生成的类无法转换到我
  • navigator.geolocation.getCurrentPosition 获取位置偏移

    navigator geolocation getCurrentPosition function position 获取当前位置成功返回 经度 coords longitude 纬度 coords latitude 准确度 coords
  • 前端Vue模板页面(组件最全)

    https github com PanJiaChen vue element admin 这里是一个真诚的 青年技术交流QQ群 761374713 不管你是大学生 社畜 想学习变成的其他人员 欢迎大家加入我们 一起成长 一起进步 真诚的欢
  • Centos7 安装 Docker Compose

    目录 一 Docker Compose 简介 二 环境准备 三 安装 四 验证 五 问题解决 一 Docker Compose 简介 Compose 是用于定义和运行多容器 Docker 应用程序的工具 通过 Compose 您可以使用 Y
  • 九、JDK1.8—并行流与串行流

    并行流 并行流就是把一个内容分成多个数据块 并用不同的线程分 别处理每个数据块的流 Java 8 中将并行进行了优化 我们可以很容易的对数据进行并 行操作 Stream API 可以声明性地通过 parallel 与 sequential