JUC并发编程-四大函数式接口、Stream 流式计算、ForkJoin并行执行任务

本文主要是介绍JUC并发编程-四大函数式接口、Stream 流式计算、ForkJoin并行执行任务,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

12. 四大函数式接口

新时代的程序员:lambda表达式、链式编程、函数式接口、Stream流式计算

函数式接口:只有一个方法的接口,可以有一些默认的方法

如:Runnable接口函数

在这里插入图片描述

1)Function 函数型接口

在这里插入图片描述

public class FunctionDemo {public static void main(String[] args) {Function<String, String> function = (str) -> {return str;};System.out.println(function.apply("aaaaaaaaaa"));}
}

2)Predicate 断定型接口

在这里插入图片描述

public class PredicateDemo {public static void main(String[] args) {Predicate<String> predicate = (str) -> {return str.isEmpty();};// falseSystem.out.println(predicate.test("aaa"));// trueSystem.out.println(predicate.test(""));}
}

3)Consummer 消费型接口

在这里插入图片描述

在这里插入图片描述

/*** 消费型接口 没有返回值!只有输入!*/
public class Demo3 {public static void main(String[] args) {Consumer<String> consumer = (str)->{System.out.println(str);};consumer.accept("abc");}
}

4)Suppier 供给型接口

在这里插入图片描述

在这里插入图片描述

/*** 供给型接口,只返回,不输入*/
public class Demo4 {public static void main(String[] args) {Supplier<String> supplier = ()->{return "1024";};System.out.println(supplier.get());}

13. Stream 流式计算

在这里插入图片描述
在这里插入图片描述

/*** Description:* 题目要求: 用一行代码实现* 1. Id 必须是偶数* 2.年龄必须大于23* 3. 用户名转为大写* 4. 用户名倒序* 5. 只能输出一个用户**/public class StreamDemo {public static void main(String[] args) {User u1 = new User(1, "a", 23);User u2 = new User(2, "b", 23);User u3 = new User(3, "c", 23);User u4 = new User(6, "d", 24);User u5 = new User(4, "e", 25);List<User> list = Arrays.asList(u1, u2, u3, u4, u5);//封装对象// lambda、链式编程、函数式接口、流式计算list.stream().filter(user -> {return user.getId()%2 == 0;}).filter(user -> {return user.getAge() > 23;}).map(user -> {return user.getName().toUpperCase();}).sorted((user1, user2) -> {return user2.compareTo(user1);}).limit(1).forEach(System.out::println);}
}

14. ForkJoin

ForkJoin 在JDK1.7,并行执行任务提高效率~。在大数据量速率会更快

大数据中:MapReduce 核心思想->把大任务拆分为小任务!

在这里插入图片描述

1)ForkJoin 特点: 工作窃取!

实现原理是:双端队列!从上面和下面都可以去拿到任务进行执行
在这里插入图片描述

2)如何使用ForkJoin?

  • 1、通过ForkJoinPool来执行
  • 2、计算任务 execute(ForkJoinTask task)
  • 3、计算类要去继承ForkJoinTask;
理解API

在这里插入图片描述

ForkJoin 的计算类

package com.marchsoft.forkjoin;import java.util.concurrent.RecursiveTask;public class ForkJoinDemo extends RecursiveTask<Long> {private long star;private long end;/** 临界值 */private long temp = 1000000L;public ForkJoinDemo(long star, long end) {this.star = star;this.end = end;}/*** 计算方法* @return*/@Overrideprotected Long compute() {if ((end - star) < temp) {Long sum = 0L;for (Long i = star; i < end; i++) {sum += i;}return sum;}else {// 使用ForkJoin 分而治之 计算//1 . 计算平均值long middle = (star + end) / 2;ForkJoinDemo forkJoinDemo1 = new ForkJoinDemo(star, middle);// 拆分任务,把线程压入线程队列forkJoinDemo1.fork();ForkJoinDemo forkJoinDemo2 = new ForkJoinDemo(middle, end);forkJoinDemo2.fork();long taskSum = forkJoinDemo1.join() + forkJoinDemo2.join();return taskSum;}}
}

测试类

package com.marchsoft.forkjoin;import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.stream.LongStream;public class ForkJoinTest {private static final long SUM = 20_0000_0000;public static void main(String[] args) throws ExecutionException, InterruptedException {test1();test2();test3();}/*** 使用普通方法*/public static void test1() {long star = System.currentTimeMillis();long sum = 0L;for (long i = 1; i < SUM ; i++) {sum += i;}long end = System.currentTimeMillis();System.out.println(sum);System.out.println("时间:" + (end - star));System.out.println("----------------------");}/*** 使用ForkJoin 方法*/public static void test2() throws ExecutionException, InterruptedException {long star = System.currentTimeMillis();ForkJoinPool forkJoinPool = new ForkJoinPool();ForkJoinTask<Long> task = new ForkJoinDemo(0L, SUM);ForkJoinTask<Long> submit = forkJoinPool.submit(task);Long along = submit.get();System.out.println(along);long end = System.currentTimeMillis();System.out.println("时间:" + (end - star));System.out.println("-----------");}/*** 使用 Stream 流计算*/public static void test3() {long star = System.currentTimeMillis();long sum = LongStream.range(0L, 20_0000_0000L).parallel().reduce(0, Long::sum);System.out.println(sum);long end = System.currentTimeMillis();System.out.println("时间:" + (end - star));System.out.println("-----------");}
}

.parallel().reduce(0, Long::sum)使用一个并行流去计算整个计算,提高效率。

在这里插入图片描述

JUC并发编程-四大函数式接口、Stream 流式计算、ForkJoin并行执行任务 到此完结,笔者归纳、创作不易,大佬们给个3连再起飞吧

这篇关于JUC并发编程-四大函数式接口、Stream 流式计算、ForkJoin并行执行任务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/663541

相关文章

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

windows和Linux使用命令行计算文件的MD5值

《windows和Linux使用命令行计算文件的MD5值》在Windows和Linux系统中,您可以使用命令行(终端或命令提示符)来计算文件的MD5值,文章介绍了在Windows和Linux/macO... 目录在Windows上:在linux或MACOS上:总结在Windows上:可以使用certuti

Pandas中统计汇总可视化函数plot()的使用

《Pandas中统计汇总可视化函数plot()的使用》Pandas提供了许多强大的数据处理和分析功能,其中plot()函数就是其可视化功能的一个重要组成部分,本文主要介绍了Pandas中统计汇总可视化... 目录一、plot()函数简介二、plot()函数的基本用法三、plot()函数的参数详解四、使用pl

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决