【Java开发】JUC进阶 05:函数式接口、ForkJoin
1 四大函数式接口
函数式接口:只有一个抽象方法的接口,只要是函数式接口,就可以用lambda表达式简化
例如Runnable:
@FunctionalInterface
public interface Runnable {public abstract void run();
}框架底层大量应用函数式接口,用来简化编程模型。
1.1 Function
Function函数式接口:该接口用到两个参数,一个是输入参数,一个是输出参数
@FunctionalInterface
public interface Function<T, R> {R apply(T t);
...
}📌 demo
public class demo1 {public static void main(String[] args) {//匿名内部类Function function = new Function<String,String>(){@Overridepublic String apply(String s) {return s;}};// //lambda表达式Function<String,String> function = (str) ->{return str;};System.out.println(function.apply("AAA"));}
}1.2 Predicate
Predicate断定型接口:有一个输入参数,返回值只能是布尔值
@FunctionalInterface
public interface Predicate<T> {boolean test(T t);
...
}📌 demo
public class demo2 {public static void main(String[] args) {//判断字符串是否为空Predicate<String> predicate = new Predicate<String>() {@Overridepublic boolean test(String str) {return str.isEmpty();}};Predicate<String> predicate =(str)->{return str.isEmpty();};System.out.println(predicate.test(""));}
}1.3 Predicate
Predicate消费型接口:只有输入,没有返回值
@FunctionalInterface
public interface Consumer<T> {void accept(T t);
...
}📌 demo
public class demo3 {public static void main(String[] args) {//匿名内部类Consumer<String> consumer = new Consumer<String>(){@Overridepublic void accept(String str) {System.out.println(str);}};//lambda表达式Consumer<String> consumer = (str)->{System.out.println(str);};consumer.accept("AAA");}
}1.4 Predicate
Predicate供给型接口:没有参数,但有返回值
@FunctionalInterface
public interface Supplier<T> {T get();
}📌 demo
public class demo4 {public static void main(String[] args) {Supplier<String> supplier = new Supplier<String>() {@Overridepublic String get() {return "1024";}};Supplier<String> supplier = ()->{return "1024";};supplier.get();}
}2 ForkJoin
📌 要点
ForkJoin是JDK1.7之后推出,用来并行执行任务!用于提高效率,适用大数据量的场景。
ForkJoin将复杂的计算当做一个任务,将其分解为多个计算并当做一个个子任务来并行执行
工作窃取:ForkJoin将某个大任务分解为若干互不依赖的子任务,这些子任务分别放到不同的队列里,每个队列创建一个单独的线程来执行队列里的任务,线程和队列一一对应;那么会出现这么一种情况:某些线程执行较快,其他线程则还在干活,因此工作窃取机制就来了--干完活的线程会从其他线程的队列里窃取一个任务来执行,同时双端队列允许两个线程同时访问一个线程。
📌 使用forkjoin
forkjoinPool通过它来执行
计算任务forkjoinPool.execute(ForkJoinTask task)
计算类继承RecursiveTask(RecursiveTask继承至ForkJoinTask)
//计算类
public class ForkJoinDemo extends RecursiveTask<Long> {private long start;private long end;//临界值private long temp = 10000L;public ForkJoinDemo(long start,long end){this.start = start;this.end = end;}@Overrideprotected Long compute() {if ((end-start)<temp){long sum = 0L;for (long i = start;i <= end;i++){sum += i;}return sum;}else {//forkjoinlong middle = (start+end)/2;//中间值ForkJoinDemo task1 = new ForkJoinDemo(start,middle);task1.fork();//拆分任务,把任务压入线程队列ForkJoinDemo task2 = new ForkJoinDemo(middle+1,end);task2.fork();//拆分任务,把任务压入线程队列return task1.join()+task2.join();}}
}📌 求和三种方式
因为前两种方式我用的long数据类型,所以计算会快一些。
public class ForkJoinTest {public static void main(String[] args) throws ExecutionException, InterruptedException {common(); //263forkJoin(); //140stream();//232}//1、普通程序员public static void common(){long sum = 0;long start = System.currentTimeMillis();for (long i = 1L; i <= 10_0000_0000; i++) {sum += i;}long end = System.currentTimeMillis();System.out.println("sum = "+sum+" 时间:"+(end - start));}//2、使用ForkJoinpublic static void forkJoin() throws ExecutionException, InterruptedException {long start = System.currentTimeMillis();ForkJoinPool forkJoinPool = new ForkJoinPool();ForkJoinTask<Long> task = new ForkJoinDemo(1L,10_0000_0000L);ForkJoinTask<Long> submit =forkJoinPool.submit(task);long sum = submit.get();long end = System.currentTimeMillis();System.out.println("sum = "+sum+" 时间:"+(end - start));}//3、stream并行流public static void stream() throws ExecutionException, InterruptedException {long start = System.currentTimeMillis();//reduce:将流中元素反复结合起来,得到一个值,下边也可简化为.reduce(Long::sum)--调用Long类中的sum方法OptionalLong sum1 = LongStream.rangeClosed(1L,10_0000_0000L).parallel().reduce((a, b)->a+b);long end = System.currentTimeMillis();System.out.println("sum = "+sum1.getAsLong()+" 时间:"+(end - start));}
}
相关文章:
【Java开发】JUC进阶 05:函数式接口、ForkJoin
1 四大函数式接口函数式接口:只有一个抽象方法的接口,只要是函数式接口,就可以用lambda表达式简化例如Runnable:FunctionalInterface public interface Runnable {public abstract void run(); }框架底层大量应用函数式接口&#…...
Nginx支持quic协议
第一种方式:Nginx官方nginx-quic搭建 通过部署Nginx官方的QUIC分支来实现的浏览器和nginx-quic服务器粗略的HTTP3通信。 1、下载BoringSSL BoringSSL 是由谷歌开发,从 OpenSSL 中分离的一个分支。BoringSSL 是 Chrome/Chromium、Android(但它不是 NDK 的…...
笔记 - Java 内存结构与模型
-- Java里内存结构与内存模型是两种概念 一、Java内存结构: HeapMemory - 堆内存Java Stacks - 栈内存 (运行时)Method Area - 方法区Native Method Stack - 本地方法栈 真实和系统打交道的地方Jit Compiler - 将java运行指令编译成机器指令G…...
C#基础教程12 数组
文章目录 C# 数组(Array)C# 中的数组声明数组初始化数组赋值给数组访问数组元素C# 数组细节C# 数组(Array) 数组是一个存储相同类型元素的固定大小的顺序集合。数组是用来存储数据的集合,通常认为数组是一个同一类型变量的集合。 声明数组变量并不是声明 number0、number1…...
Android中级——屏幕和绘图
屏幕和绘图屏幕系统屏幕密度独立像素密度dp单位转换XML绘图(需放在Drawable)BitmapShapeLayerSelector绘图技巧CanvasLayerPorterDuffXfermodeShaderPathEffectSurfaceView屏幕 屏幕大小:指屏幕对角线长度,单位为寸分辨率&#x…...
Linux - 第6节 - 动态库和静态库
1.静态库与动态库概念 静态库(.a):程序在编译链接的时候把库的代码拷贝到可执行文件中。程序运行的时候将不再需要静态库。动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用…...
【Java学习笔记】12.Character 类及String 类
前言 本章介绍Java的Character 类和String 类。 Java Character 类 Character 类用于对单个字符进行操作。 Character 类在对象中包装一个基本类型 char 的值 实例 char ch a;// Unicode 字符表示形式 char uniChar \u039A; // 字符数组 char[] charArray { a, b, c, d…...
【C++修炼之路】26.C++11(语法糖)
每一个不曾起舞的日子都是对生命的辜负 C11C11(语法糖)本节目标一.C11简介二.统一的列表初始化2.1 {}初始化2.2 std::initializer_list三.声明3.1 auto3.2 decltype3.3 nullptr四.总结C11(语法糖) 本节目标 C11简介 列表初始化 变量类型推导 一.C11简介 在2003年C标准委员…...
KD610精密油介损体积电阻率测试仪
一、概述 KD610精密油介损体积电阻率测试仪是用于绝缘油等液体绝缘介质的介质损耗角及体积电阻率的高精密仪器。 二、产品特点 1.仪器内部采用数字技术,具备多种模式测式。 2.智能自动化测量。 3.配备了大屏幕(2401…...
快速了解原码、反码、补码和位运算
我们知道计算机使用的是二进制,我们⽤⼀个字节,也就是8个bit 来表示⼆进制数。 原码 十进制 原码20000 0010-21000 0010 原码其实是最容易理解的,只不过需要利⽤⼆进制中的第⼀位来表示符号位,0表示正数,1表示…...
算法的复杂度介绍
算法的复杂度介绍 算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别。 为什么要进行算法分析&…...
教你如何搭建店铺—收支管理系统,demo可分享
1、简介1.1、案例简介本文将介绍,如何搭建店铺-收支管理。1.2、应用场景以店铺收支管理为核心,维度数据分析,智能指导门店经营,账目清晰一目了然,店铺经营更高效。2、设置方法2.1、表单搭建1)新建表单【客户…...
java性能分析-堆内存最佳实践-堆分析
堆内存最佳实践 优化垃圾回收器标志参数很重要但是采用更好的编程实践获得更大的性能提升 1.谨慎的创建对象并尽快的丢弃,是更好的内存是提高gc更好的方法 2.频繁创建某种类型的对象会导致整体的性能变差 对象复用设计 线程局部变量 每个线程中创建一个局部变量…...
3月8号作业
题目:题目一:vmlinux可执行文件如何产生题目二:整理内核编译流程:uImage,zImage,Image,vmlinux之间的关系答案一:在内核源码目录下vi Makefile,搜索vmlinux目标,vmlinux: scripts/li…...
Flink相关介绍
简介 Flink的定位是:Apache Flink是一个框架和分布式处理引擎,如图所示,用于对无界和有界数据流进行有状态计算。Flink被设计在所有常见的集群环境运行,以内存执行速度和任意规模来执行计算。 Flink 框架处理流程应用场景 1、电…...
Java 8 排序
今天分享 Java 8 进行排序的 10 个姿势,其实就是把 Java 8 中的 Lambda、Stream、方法引用等知识点串起来 传统排序 现在有一个 List 集合: public static List<User> LIST new ArrayList() {{add(new User("Lisa", 23));add(new Us…...
Blazor_WASM之4:路由
Blazor_WASM之4:路由 路由模板 通过 Router组件可在 Blazor 应用中路由到 Razor 组件。 Router 组件在 Blazor 应用的 App 组件中使用。App组件模板如下 <Router AppAssembly"typeof(Program).Assembly"><Found Context"routeData"…...
对Vue响应式的理解
1. 啥是响应式? (1).所谓的数据响应式就是能够使数据变化可以被检测到并且对这种变化做出响应式的机制 2. 为什么vue需要响应式? (1).MVVM框架中要解决的核心问题数据驱动视图,数据的改变引起视图的更新ÿ…...
磁盘阵列Raid探讨
最近公司买服务器,顺便了解一下服务器配置方面的问题 以下讨论的都是入门级服务器配置,全部是主观意见,没有任何科学依据,欢迎大家讨论 Raid0,Raid1,Raid10,Raid5,Raid6(Raid5热备)…...
基于MyBatis依次、批量、分页增删改查
我们知道处理数据有三种思路:依次、批量、分页,对应方法如下 依次处理:在 Java 里面写 for 循环,依次使用 SQL 语句,频繁连接断开数据库批量处理:在 MyBatis 里面用 <foreach> 拼接成一条长 SQL 语句…...
如何高效下载B站视频:Python开源工具bilibili-downloader完全指南
如何高效下载B站视频:Python开源工具bilibili-downloader完全指南 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader B站视频…...
鸣潮自动化终极指南:解放双手,轻松享受游戏乐趣的完整解决方案
鸣潮自动化终极指南:解放双手,轻松享受游戏乐趣的完整解决方案 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸 一键日常 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves …...
烟草行业专卖管理数据统计自动化方案:基于企业级Agent的非侵入式架构实践指南
摘要: 站在2026年5月的技术时点回看,烟草行业的数字化转型已进入从“经验驱动”向“智能治理”跨越的关键期。面对专卖管理中行政许可、市场监管、资产管理等业务产生的海量、异构数据,传统的手工统计与硬编码自动化方案正面临系统烟囱、API缺…...
开发AI应用时利用Taotoken实现多模型聚合与路由策略
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 开发AI应用时利用Taotoken实现多模型聚合与路由策略 应用场景类,面向正在构建复杂AI应用的架构师或开发者,…...
深度解析 | SRE 核心机制:如何通过“错误预算”平衡速度与稳定性?
在网站可靠性工程 (SRE) 的世界中,在创新的速度与系统的稳定性之间找到完美的平衡是一项持续的挑战。虽然开发团队致力于快速发布新功能,但运维团队和 SRE 的目标则是保持系统平稳运行且不中断。这种利益冲突常常导致团队之间的摩擦。而这正是错误预算 (…...
Office RibbonX Editor:免费开源的Office界面定制终极指南
Office RibbonX Editor:免费开源的Office界面定制终极指南 【免费下载链接】office-ribbonx-editor An overhauled fork of the original Custom UI Editor for Microsoft Office, built with WPF 项目地址: https://gitcode.com/gh_mirrors/of/office-ribbonx-ed…...
Ventoy终极指南:一键制作万能启动盘的完整教程
Ventoy终极指南:一键制作万能启动盘的完整教程 【免费下载链接】Ventoy A new bootable USB solution. 项目地址: https://gitcode.com/GitHub_Trending/ve/Ventoy 你是否厌倦了每次安装系统都要重新格式化U盘?Ventoy是一款革命性的开源启动盘制作…...
基于YOLOv10的低延迟AI瞄准系统:多平台硬件加速与实时检测架构设计
基于YOLOv10的低延迟AI瞄准系统:多平台硬件加速与实时检测架构设计 【免费下载链接】yolov8_aimbot Aim-bot based on AI for all FPS games 项目地址: https://gitcode.com/gh_mirrors/yo/yolov8_aimbot Sunone Aimbot是一个基于YOLOv10深度学习模型的FPS游…...
告别拥塞:手把手优化Dragonfly网络性能,UGAL-LVC_H算法详解与配置
告别拥塞:手把手优化Dragonfly网络性能,UGAL-LVC_H算法详解与配置 在数据中心网络架构中,Dragonfly拓扑以其高度可扩展性和低直径特性脱颖而出,成为超大规模计算环境的理想选择。然而,当面对对抗性流量模式时ÿ…...
微软下周更新 Office 应用:允许禁用 Copilot 浮动按钮,回应用户控制需求
Office 更新:禁用 Copilot 浮动按钮微软将于下周推出 Office 应用更新,此次更新允许用户禁用浮动的 Copilot 按钮。近几周,该按钮已出现在 Word、Excel 和 PowerPoint 中,悬浮在电子表格或文档的右下角,给用户带来了诸…...
