JUC——并发编程—第三部分

news2024/11/30 6:53:59

四大函数式接口(必须掌握)

函数式接口:只有一个方法的接口

@FunctionalInterface
public interface Runnable {
    public abstract void run();
}

//简化编程模型,在新版本的框架底层大量应用
//foreach(消费者的函数式接口)

Function接口(函数型接口)

/**
 * Function 函数型接口,有一个输入参数,有一个输出
 * 只要是函数型接口,可以用lambda表达式简化
 */
public class demo01 {
    public static void main(String[] args) {
//       Function<String,String> function=new Function<String,String>(){
//            @Override
//            public String apply(String o) {
//                return o;
//            }
//        };
       Function<String,String> function=(str)->{
           return str;
        };
        System.out.println(function.apply("asd"));
    }
}

Preddicate接口(断定型接口)

/**
 * 断定型接口: 有一个输入参数,返回值只能是布尔值!
 */
public class Demo02 {
    public static void main(String[] args) {

//        Predicate<String> predicate=new Predicate<String>() {
//            @Override
//            public boolean test(String o) {
//                if(o.isEmpty())
//                {
//                    return true;
//                }
//                return false;
//            }
//        };
        Predicate<String> predicate=(str)->{
            return str.isEmpty();
        };
        System.out.println(predicate.test("123"));
    }
}

Consumer消费型接口

/**
 * Consumer 消费型接口:只有输入,没有返回值
 */
public class demo03 {
    public static void main(String[] args) {
//        Consumer<String> consumer = new Consumer<String>(){
//            @Override
//            public void accept(String s) {
//                System.out.println(s);
//            }
//        };
        Consumer<String> consumer=(s)->{
            System.out.println(s);
        };
        consumer.accept("yhy");
    }
}

Supplier供给型接口

/**
 * Suppiler 没有参数,只有返回值
 */
public class demo04 {
    public static void main(String[] args) {
//        Supplier supplier=new Supplier<String>() {
//            @Override
//            public String get() {
//                return "114514";
//            }
//        };

        Supplier supplier=()->{
            return "114514";
        };
        System.out.println(supplier.get());
    }
}

Stream流式计算

集合,MySQL本质都是存储东西。计算交给流来操作。

在这个接口有如下方法

 

等等这些方法都是函数式接口。 

public class Test {
    public static void main(String[] args) {
        User u1=new User(1,"a",21);
        User u2=new User(2,"b",22);
        User u3=new User(3,"c",23);
        User u4=new User(4,"d",24);
        User u5=new User(5,"e",25);
        User u6=new User(6,"g",26);
        //集合存储
        List<User> list= Arrays.asList(u1,u2,u3,u4,u5,u6);
        //计算交给Stream流
        //Lambda表达式、链式编程、函数式接口、Stream流式计算
        list.stream()
                .filter(u->{return u.getId()%2==0;})
                .filter(u->{return u.getAge()>23;})
                .map(u->{return u.getName().toUpperCase();})
                .sorted((uu1,uu2)->{return uu2.compareTo(uu1);})
                .limit(1)
                .forEach(System.out::println);
    }
}

Forkjoin(分支合并)

在jdk1.7,并行执行任务!提高效率。大数据量!

大数据:Map Reduce(把大任务拆分为小任务)

Forkjoin特点:工作窃取

里面维护的都是双端队列。

两个线程执行任务,一个提前完成了就会去执行另一个的任务。


/**
 * 求和计算任务
 * 3000 6000(forkjoin) 9000(Stream并行流)
 * //如何使用Forkjoin
 * //1.forkjoinpool
 * //2.计算任务forkjointaskPool.execute(ForkJoinTask<?>task)
 * //3.计算类继承RecursiveTask<Long>
 */
public class ForkJoin extends RecursiveTask<Long> {
    private Long start;
    private Long end;

    private Long temp=10000L;

    public ForkJoin(Long start, Long end) {
        this.start = start;
        this.end = end;
    }

    @Override
    protected Long compute() {
        if((end-start)<temp) {
            Long sum = 0L;
            for(int i=0;i<10_0000_0000;i++)
            {
                sum+=i;
            }
            return sum;
        }else{
            //分支合并计算
            Long middle=(start+end)/2;//中间值
            ForkJoin task1=new ForkJoin(start,middle);
            task1.fork();//拆分任务,将任务压入线程队列。
            ForkJoin task2=new ForkJoin(middle+1,end);
            task2.fork();//拆分任务,将任务压入线程队列。
            return task1.join()+task2.join();
        }
    }
}

 这个玩意本质上就是的二分+递归,很简单的算法。

每二分一次线程数+1;各个线程执行不同段的计算任务。

/**
 *  3000 6000(forkjoin) 9000(Stream并行流)
 */
public class Test {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
//        test1(); //sum-243309312时间:9346
//        test2(); //8088??????  好像也没快多少
        test3(); //700 究极快,最大限度利用CPU
    }
    public static void test1(){
        long start =System.currentTimeMillis();
        Long sum=0L;
        for(Long i=1L;i<=10_0000_0000;i++){
            sum+=i;
        }
        long end=System.currentTimeMillis();
        System.out.println("sum"+sum+"时间:"+(end-start));
    }

    //使用forkjoin
    public static void test2() throws ExecutionException, InterruptedException {
        long start =System.currentTimeMillis();
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        ForkJoinTask<Long> forkJoin = new ForkJoin(0L, 10_0000_0000L);
        ForkJoinTask<Long> submit=forkJoinPool.submit(forkJoin);//提交任务,有结果
        Long sum=submit.get();
    //forkJoinPool.execute(forkJoin);//执行,没有结果
        long end=System.currentTimeMillis();
        System.out.println("sum"+sum+"时间:"+(end-start));
    }
    //使用stream并行流
    public static void test3(){
        long start =System.currentTimeMillis();
        //(]
        LongStream.rangeClosed(0L,10_0000_0000L).parallel().reduce(0,Long::sum);
        long end=System.currentTimeMillis();
        System.out.println("sum"+"时间:"+(end-start));
    }
}

异步回调(Future接口)

Future接口设计的初衷:对将来的事件进行建模。

前后端异步通信有ajax,java中也有异步通信。

 

/**
 * 异步调用: CompltableFuture
 * //异步调用
 * //成功回调
 * //失败回调
 */
public class demo01 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
//        //没有返回值的异步回调
//        CompletableFuture<Void> completedFuture = CompletableFuture.runAsync(()->{
//            try {
//                TimeUnit.SECONDS.sleep(2);
//            } catch (InterruptedException e) {
//                throw new RuntimeException(e);
//            }
//            System.out.println(Thread.currentThread().getName()+"runAsync=>void");
//        });
//        System.out.println("11111");
//        completedFuture.get(); //阻塞获取执行结果
//        System.out.println("22222");

        //有返回值的异步回调
        //ajax,成功和失败的回调
        //返回的是错误信息
        CompletableFuture<Integer> completedFuture =CompletableFuture.supplyAsync(()->{
            System.out.println(Thread.currentThread().getName()+"  runAsync=>void");
            int t=10/0;
            return 1024;
        });
        System.out.println(completedFuture.whenComplete((t, u) -> {
            System.out.println("t=>"+t); //正常的返回结果
            System.out.println("u=>"+u); //抛出的错误信息
        }).exceptionally((e) -> {
            System.out.println(e.getMessage());//获取报错信息
            return 233; //获取到错误的返回结果
        }).get());
    }
}
  1. whenComplete(...)方法在CompletableFuture正常完成或遇到异常时均能执行。它接收两个参数,第一个参数是正常返回的结果(如果有),第二个参数是抛出的异常(如果有)。所以,这个方法中的输出语句会在CompletableFuture正常完成或遇到异常时都执行。

  2. exceptionally(...)方法是用于处理异常情况的。如果CompletableFuture遇到异常,exceptionally(...)方法会被触发,并且它返回一个备用的结果。在你的代码中,exceptionally(...)方法中的代码会捕获到supplyAsync(...)中的异常(因为你在supplyAsync(...)中除以0了),然后输出异常信息并返回一个备用的结果(233)。因此,这个方法会执行,并输出异常信息。

综上所述,这句输出语句会执行是因为whenComplete(...)方法在正常或异常完成时都会执行,而exceptionally(...)方法会捕获异常并处理它,然后返回备用结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1054948.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中睿天下参展2023海军工程大学首届网络安全文化周并发表主题演讲

2023年9月3日至9月8日&#xff0c;海军工程大学首届网络安全文化周活动于武汉举办。本次活动以“守护蓝疆网安有我”为主题&#xff0c;设有特邀嘉宾前沿讲座、网络安全圆桌交流论坛、网络安全科技展、网络对抗实战竞技、网络安全保密视频创作和信息安全知识竞赛等系列活动。 海…

聊聊网络编程中的粘包、拆包、半包、编解码

聊聊网络编程中的粘包、拆包、半包、编解码 文章目录 1. 引言2. 粘包、拆包、半包现象解析2.1. 粘包现象2.2. 拆包现象2.3. 半包现象 3. 解决粘包、拆包、半包问题的方法4. netty 是如何解决解决粘包、拆包、半包问题参考文档 1. 引言 在网络编程中&#xff0c;TCP/IP 协议是…

uboot启动流程-涉及s_init汇编函数

一. uboot启动涉及函数 本文简单分析uboot启动流程中&#xff0c;涉及的汇编函数&#xff1a; lowlevel_init函数调用的函数&#xff1a;s_init 函数 save_boot_params_ret函数调用的函数&#xff1a; _main 函数 本文继上一篇文章的学习&#xff0c;地址如下&#xff1a;…

第七章 查找 八、B树

目录 一、定义 二、B树的核心特性 1、B树各个结点的子树数和关键字数 2、子树高度 3、关键字的值 4、B树高度 三、B树的插入 四、B树的删除 一、定义 B树&#xff0c;又称多路平衡查找树&#xff0c;B树中所有结点的孩子个数的最大值称为B树的阶&#xff0c;通常用m表示…

Apache Commons Pool2 池化技术

对象池是一种设计模式&#xff0c;用于管理和重用对象&#xff0c;以提高性能和资源利用率。对象池的概念在许多应用程序中都有广泛应用&#xff0c;特别是在需要频繁创建和销毁对象的情况下&#xff0c;例如数据库连接、线程、HTTP连接等 对象池通过预先创建一组对象并将它们存…

MPLS虚拟专用网--跨域OptionC方案

OptionC方案 前面介绍的两种方式都能够满足跨域VPN的组网需求,但这两种方式也都需要ASBR参与VPN-IPv4路由的维护和发布。当每个AS都有大量的VPN路由需要交换时,ASBR就很可能阻碍网络进一步的扩展。 解决上述问题的方案是:ASBR不维护或发布VPN-IPv4路由,PE之间直接交换VPN-…

【算法】算法基础课模板大全

一、基础算法 快速排序算法模板 void quick_sort(int q[], int l, int r) {//递归的终止情况if (l > r) return;//选取分界线。这里选数组中间那个数int i l - 1, j r 1, x q[l r >> 1];//划分成左右两个部分while (i < j){do i ; while (q[i] < x);do …

用两个栈来实现队列

typedef int SltDatatype; typedef struct Stack {SltDatatype* a;//开辟栈的动态内存空间int top;//记录栈顶int capacity;//记录容量 }ST;void STInit(ST* ps);//栈的初始化 void STDestroy(ST* ps);//释放 void STPush(ST* ps, SltDatatype x);//入栈 void STPop(ST* ps);//…

喝健康白酒 有益生心健康

中国的制酒史源远流长&#xff0c;酒渗透在中华五千年的文化中。酒与烟不同&#xff0c;烟对人体有百害而无一利&#xff0c;而对于酒&#xff0c;若掌握好饮酒的度&#xff0c;对人体有一定的养生作用&#xff0c;所以我们通常会说“戒烟限酒”。 据一些专家研究&#xff0c;…

下载盗版网站视频并将.ts视频文件合并

. 1.分析视频请求123 2.数据获取和拼接 1.分析视频请求 1 通过抓包观察我们发现视频是由.ts文件拼接成的每一个.ts文件代表一小段2 通过观察0.ts和1.ts的url我们发现他们只有最后一段不同我们网上找到url获取的包3 我们发现index.m3u8中储存着所有的.ts文件名在拼接上前面固定…

重置Jetson设备的Ubuntu密码:通过挂载根目录到另一个Linux系统

在本文中&#xff0c;我们将介绍如何在忘记Ubuntu 20.04密码的情况下重置密码。我们将通过将Ubuntu的根目录挂载到另一个Linux系统来实现这一目的。我们还将介绍chroot命令的功能。 1. 背景 最近&#xff0c;我们研发团队遇到了一个棘手的问题。一台用于研发&#xff0c;多人使…

验证曲线(validation_curve)项目实战

验证曲线 validation_curve 一、简介 validation_curve验证曲线&#xff0c;可确定不同参数值下的训练和测试分数 根据指定参数的不同值计算估计器的得分 这与使用一个参数的网格搜索类似。不过&#xff0c;这也会计算训练得分&#xff0c;只是一个用于绘制结果的工具。 二、…

十个有用的 Vue.js 自定义 Hook

Vue.js 是我使用的第一个 JavaScript 框架。 我可以说 Vue.js 是我进入 JavaScript 世界的第一扇门之一。 目前&#xff0c;Vue.js 仍然是一个很棒的框架。 我认为有了组合 API&#xff0c;Vue.js 只会增长得更多。 在本文中&#xff0c;我将向分享 10 个可以使用 Vue.js 制作…

计算机竞赛 深度学习手势识别 - yolo python opencv cnn 机器视觉

文章目录 0 前言1 课题背景2 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 3 YOLOV53.1 网络架构图3.2 输入端3.3 基准网络3.4 Neck网络3.5 Head输出层 4 数据集准备4.1 数据标注简介4.2 数据保存 5 模型训练5.1 修…

竞赛 多目标跟踪算法 实时检测 - opencv 深度学习 机器视觉

文章目录 0 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习多目标跟踪 …

【笔试强训day01】组队竞赛 删除公共字符

​&#x1f47b;内容专栏&#xff1a; 笔试强训集锦 &#x1f428;本文概括&#xff1a;C笔试面试常考题之笔试强训day01。 &#x1f43c;本文作者&#xff1a; 阿四啊 &#x1f438;发布时间&#xff1a;2023.10.1 一、day01 1.组队竞赛 题目描述 题目描述&#xff1a;牛牛举…

【JavaEE】JavaScript

JavaScript 文章目录 JavaScript组成书写方式行内式内嵌式外部式&#xff08;推荐写法&#xff09; 输入输出变量创建动态类型基本数据类型数字类型特殊数字值 String转义字符求长度字符串拼接布尔类型undefined未定义数据类型null 运算符条件语句if语句三元表达式switch 循环语…

【算法|贪心算法系列No.3】leetcode334. 递增的三元子序列

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

[C++_containers]10分钟让你掌握vector

前言 在一个容器的创建或是使用之前&#xff0c;我们应该先明白这个容器的一些特征。 我们可以通过文档来来了解&#xff0c;当然我也会将重要的部分写在下面。 1. vector 是表示可变大小数组的序列容器。 2. 就像数组一样&#xff0c; vector 也采用的连续存储空间来存储元…

picoctf_2018_shellcode

picoctf_2018_shellcode Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX disabled PIE: No PIE (0x8048000) RWX: Has RWX segments32位&#xff0c;啥都没开 这个看着挺大的&#xff0c;直接来个ROPchain&#xff0c;…