【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 语句…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...
实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...
数据库——redis
一、Redis 介绍 1. 概述 Redis(Remote Dictionary Server)是一个开源的、高性能的内存键值数据库系统,具有以下核心特点: 内存存储架构:数据主要存储在内存中,提供微秒级的读写响应 多数据结构支持&…...
STM32标准库-ADC数模转换器
文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”:输入模块(GPIO、温度、V_REFINT)1.4.2 信号 “调度站”:多路开关1.4.3 信号 “加工厂”:ADC 转换器(规则组 注入…...
