线程池在项目中的使用

news2024/12/23 9:14:55

1.runAsync执行完后无返回值

package com.search.thread;
import java.util.concurrent.*;
public class ThreadTest {

    public static ExecutorService executor = Executors.newFixedThreadPool(10);

    public static void main(String[] args) throws ExecutionException, InterruptedException {
    
        System.out.println("main......start.....");
        CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
            System.out.println("当前线程:" + Thread.currentThread().getId());
            int i = 10 / 2;
            System.out.println("运行结果:" + i);
        }, executor);
    }
}  

2.supplyAsync执行完后有返回值,后续能感知异常

package com.search.thread;
import java.util.concurrent.*;
public class ThreadTest {

    public static ExecutorService executor = Executors.newFixedThreadPool(10);

    public static void main(String[] args) throws ExecutionException, InterruptedException {
    
         /**
         * 方法完成后的处理
         */
       CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
             System.out.println("当前线程:" + Thread.currentThread().getId());
             int i = 10 / 0;
             System.out.println("运行结果:" + i);
             return i;
         }, executor).whenComplete((res,exception) -> {
             //虽然能得到异常信息,但是没法修改返回数据
             System.out.println("异步任务成功完成了...结果是:" + res + "异常是:" + exception);
         }).exceptionally(throwable -> {
             //可以感知异常,同时返回默认值
             return 10;
        });
    }
} 

3.supplyAsync执行完后有返回值,后续能感知异常

package com.search.thread;
import java.util.concurrent.*;
public class ThreadTest {

    public static ExecutorService executor = Executors.newFixedThreadPool(10);

    public static void main(String[] args) throws ExecutionException, InterruptedException {
    
        /**
         * 方法执行完后端处理
         */
         CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
             System.out.println("当前线程:" + Thread.currentThread().getId());
             int i = 10 / 2;
             System.out.println("运行结果:" + i);
             return i;
         }, executor).handle((result,thr) -> {
             if (result != null) {
                return result * 2;
             }
             if (thr != null) {
                 System.out.println("异步任务成功完成了...结果是:" + result + "异常是:" + thr);
                 return 0;
             }
             return 0;
         });
    }
} 

4.线程串行化,如:A任务执行完再执行B任务

在这里插入图片描述

package com.search.thread;
import java.util.concurrent.*;
public class ThreadTest {

    public static ExecutorService executor = Executors.newFixedThreadPool(10);

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //1.thenRun开头的,不接受上一步(如:supplyAsync)的返回结果,thenRun执行完本身没有返回值
         CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> {
            System.out.println("当前线程:" + Thread.currentThread().getId());
            int i = 10 / 2;
            System.out.println("运行结果:" + i);
            return i;
        }, executor).thenRunAsync(()-> {
            System.out.println("任务2启动了...");
        },executor);

        // 2.thenAccept开头的,需要接受上一步(如:supplyAsync)的返回结果,thenAccept执行完本身也没有返回值
        CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> {
            System.out.println("当前线程:" + Thread.currentThread().getId());
            int i = 10 / 2;
            System.out.println("运行结果:" + i);
            return i;
        }, executor).thenAcceptAsync(res -> {
            System.out.println("任务2启动了..." + res);
        }, executor);

        // 3.thenApply开头的,需要上一步(如:supplyAsync)的返回结果,thenApply执行完本身最终会有返回值
        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
            System.out.println("当前线程:" + Thread.currentThread().getId());
            int i = 10 / 2;
            System.out.println("运行结果:" + i);
            return i;
        }, executor).thenApplyAsync(res -> {
            System.out.println("任务2启动了..." + res);
            return "Hello" + res;
        }, executor);
    }
} 

5.两任务组合 - 如:A、B两任务都要完成再执行另一个任务C

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

package com.search.thread;
import java.util.concurrent.*;
public class ThreadTest {

    public static ExecutorService executor = Executors.newFixedThreadPool(10);

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        // thenApply开头的,需要上一步(如:supplyAsync)的返回结果,thenApply执行完本身最终会有返回值
        CompletableFuture<String> future01 = CompletableFuture.supplyAsync(() -> {
            System.out.println("当前线程:" + Thread.currentThread().getId());
            int i = 10 / 2;
            System.out.println("运行结果:" + i);
            return i;
        }, executor).thenApplyAsync(res -> {
            System.out.println("任务2启动了..." + res);
            return "Hello" + res;
        }, executor);

        CompletableFuture<Integer> future02 = CompletableFuture.supplyAsync(() -> {
            System.out.println("当前线程:" + Thread.currentThread().getId());
            int i = 10 / 2;
            System.out.println("运行结果:" + i);
            return i;
        }, executor);
        
        //1.future01和future02执行完成后再执行自己的,不接受future01和future02的返回值,执行完自己的也没有返回值
        future01.runAfterBothAsync(future02,()->{
            System.out.println("任务3开始...");
        },executor);

        //2.future01和future02执行完成后再执行自己的,接受future01和future02的返回值,执行完自己的是没有返回值的
        future01.thenAcceptBothAsync(future02,(f1,f2)-{
           System.out.println("任务3开始...之前的返回结果:"+f1+"-->"+f2);
        },executor);
        
        //3.future01和future02执行完成后再执行自己的,接受future01和future02的返回值,执行完自己的是有返回值的
        CompletableFuture<String> future = future01.thenCombineAsync(future02, (f1, f2) ->(
               return f1 +":" + f2 +" -> Haha";
        },executor);
        System.out.println("main....end...."+future.get());


    }
} 

6.两任务组合 - 如:A、B两任务只要有一个完成就执行另一个任务C

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

package com.search.thread;
import java.util.concurrent.*;
public class ThreadTest {

    public static ExecutorService executor = Executors.newFixedThreadPool(10);

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        // thenApply开头的,需要上一步(如:supplyAsync)的返回结果,thenApply执行完本身最终会有返回值
        CompletableFuture<Object> future01 = CompletableFuture.supplyAsync(() -> {
            System.out.println("当前线程:" + Thread.currentThread().getId());
            int i = 10 / 2;
            System.out.println("运行结果:" + i);
            return i;
        }, executor).thenApplyAsync(res -> {
            System.out.println("任务2启动了..." + res);
            return "Hello" + res;
        }, executor);

        CompletableFuture<Object> future02 = CompletableFuture.supplyAsync(() -> {
            System.out.println("当前线程:" + Thread.currentThread().getId());
            int i = 10 / 2;
            System.out.println("运行结果:" + i);
            return i;
        }, executor);
        
        //1.future01或future02有一个执行完成后再执行自己的任务,不接受future01和future02的返回值,执行完自己的也没有返回值
        future01.runAfterEitherAsync(future02,()->{
            System.out.println("任务3开始...");
        },executor);

        //2.future01或future02有一个执行完成后再执行自己的任务,接受future01和future02的返回值(返回类型要相同),执行完自己的是没有返回值的
        future01.acceptEitherAsync(future02,(res)->{
              System.out.printn("任务3开始...之前的结果:"+res);
        },executor);
        
        //3.future01或future02有一个执行完成后再执行自己的,接受future01和future02的返回值,执行完自己的是有返回值的
        CompletableFuture<String> future = future01.applyToEitherAsync(future02, res ->{
       		 System.out.println("任务3开始...之前的结果: + res");
       		 return res.toString() +"->哈哈"
        };executor)
        System.out.printIn("main....end..."+future .get());
    }
} 

7.多任务组合 - 等待全部完成和只要有一个任务完成

在这里插入图片描述
allOf:等待所有任务完成
anyOf:只要有一个任务完成

package com.search.thread;
import java.util.concurrent.*;
public class ThreadTest {

    public static ExecutorService executor = Executors.newFixedThreadPool(10);

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        CompletableFuture<String> futureImg= CompletableFuture.supplyAsync(() -> {
     		   System.out.println("查询商品的图片信息");
      		   return "hello.jpg";
        });

       CompletableFuture<String> futureAttr = CompletableFuture.supplyAsync(() -> {
               System.out.printIn("查询商品的属性");
               return "黑色+256G";
        });
        
        CompletableFuture<String> futureDesc = CompletableFuture.supplyAsync(() -> {
              try {
                   Thread.sleep(3000);
                   System.out.println("查询商品介绍"); 
              }catch (InterruptedException e) {
                   e.printStackTrace();
              }
              return"华为";
         });


        CompletableFuture<Void> all0f = CompletableFuture.allof(futureImg, futureAttr, futureDesc);
        allof.get();//等待所有结果完成
        System.out.printIn("main,.,end...,"+futureImg.get()+"=>"+futureAttr.get()+"=>"+futureDesc.get());

        CompletableFuture<0bject> anyof = CompletableFuture.any0f(futureImg, futureAttr, futureDesc
        anyof.get();//等待所有结果完成
        System.out.printIn("main,.,end...,"+anyof.get());
    }
} 

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

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

相关文章

极米投影仪怎么样?轻薄投影极米Z7X值得选择吗?

对于当代快节奏的打工人而言&#xff0c;我们有时候很需要一些独特的方式来逃离日常生活的疲惫&#xff0c;拥有一个自己的空间&#xff0c;享受一个人的独处时光。要想享受居家独处好时光&#xff0c;当然少不了家居娱乐好伙伴极米Z7X。无论你是想要看一场科幻大片&#xff0c…

gin框架39--重构 BasicAuth 中间件

gin框架39--重构 BasicAuth 中间件 介绍gin BasicAuth 解析自定义newAuth实现基础认证注意事项说明 介绍 每当我们打开一个网址的时候&#xff0c;会自动弹出一个认证界面&#xff0c;要求我们输入用户名和密码&#xff0c;这种BasicAuth是最基础、最常见的认证方式&#xff0…

Godot 官方2D C#重构(2):弹幕躲避

前言 Godot 官方 教程 Godot 2d 官方案例C#重构 专栏 Godot 2d 重构 github地址 实现效果 技术点说明 异步函数 Godot的事件不能在Task中运行&#xff0c;因为会导致跨线程的问题。 //这样是不行的&#xff0c;因为跨线程了&#xff0c;而且会阻塞UI线程&#xff0c;具体原因…

高效恢复丢失的文件的10 款Android数据恢复工具

在当今快节奏的数字时代&#xff0c;从Android设备丢失重要数据可能是一场噩梦。 您需要一个可靠的恢复工具来取回您的数据&#xff0c;例如令人难忘的照片&#xff0c;重要的联系人&#xff0c;重要的工作文档等。 值得庆幸的是&#xff0c;有许多高效的Android数据恢复工具可…

2023年中国人力资源咨询发展历程及市场规模前景分析[图]

人力资源咨询是企业借助外部智力资源提高自身管理水平和效率的重要路径&#xff0c;属于管理咨询业的一个重要分支, 一方面&#xff0c;人力资源咨询要为企业提供基础的人力资源外包服务&#xff1b;另一方面&#xff0c;人力资源咨询要为企业提供专业化、职业化现代人力资源管…

《深入浅出OCR》实战:基于DBNet的文字检测

✨专栏介绍: 经过几个月的精心筹备,本作者推出全新系列《深入浅出OCR》专栏,对标最全OCR教程,具体章节如导图所示,将分别从OCR技术发展、方向、概念、算法、论文、数据集等各种角度展开详细介绍。 💙个人主页: GoAI |💚 公众号: GoAI的学习小屋 | 💛交流群: 7049325…

【LeetCode】54. 螺旋矩阵

1 问题 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5] 示例 2&#xff1a; 输入&#xff1a;matri…

「Qt中文教程指南」如何创建基于Qt Widget的应用程序(三)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 本文描述了如何使用…

多态的使用以及多态底层的实现(上)

什么是多态 我们让不同的对象去完成同一件事情&#xff0c;这件事情的结果是不一样的&#xff0c;例如买火车票&#xff0c;我们学生买火车票&#xff0c;普通人买火车票&#xff0c;或是军人买火车票最后结果都是不一样的。 多态的要求是什么 首先一定是要在继承中 虚函数…

机器学习笔记 - 深度学习中跳跃连接的直观解释

一、概述 如今人们利用深度学习做无数的应用。然而,为了理解在许多作品中看到的大量设计选择(例如跳过连接),了解一点反向传播机制至关重要。 如果你在 2014 年尝试训练神经网络,你肯定会观察到所谓的梯度消失问题。简单来说:你在屏幕后面检查网络的训练过程,你看到的只…

AI驱动的未来:探索人工智能的无限潜力 | 开源专题 No.39

这一系列开源项目代表着多个领域的最新技术成果&#xff0c;包括深度学习、自然语言处理、计算机视觉和分布式训练。它们共同的特点是致力于教育、资源分享、开源精神、多领域应用以及性能和效率的追求&#xff0c;为广大开发者、研究者和学生提供了宝贵的工具和知识&#xff0…

layui框架实战案例(21):layui table单元格显示图片导致复选框冗余的解决方案

图片自适应表格CSS 为防止单元格内的图片不能正常显示&#xff0c;需本地重写CSS。 /*layui-table图片自适应*/ .layui-table-cell {height: auto;line-height: 20px;}.layui-table-cell img {height: 50%;max-width: 50%; }列代码 , cols: [[{type: checkbox,fixed:left, w…

高精度时间测量(TDC)电路MS1022

MS1022 是一款高精度时间测量电路&#xff0c;内部集成了模拟比 较器、模拟开关、施密特触发器等器件&#xff0c;从而大大简化了外 围电路。同时内部增加了第一波检测功能&#xff0c;使抗干扰能力大 大提高。通过读取第一个回波脉冲的相对宽度&#xff0c;用户可以获 得接…

图像信号处理板设计原理图:2-基于6U VPX的双TMS320C6678+Xilinx FPGA K7 XC7K420T的图像信号处理板

综合图像处理硬件平台包括图像信号处理板2块&#xff0c;视频处理板1块&#xff0c;主控板1块&#xff0c;电源板1块&#xff0c;VPX背板1块。 一、板卡概述 图像信号处理板包括2片TI 多核DSP处理器-TMS320C6678&#xff0c;1片Xilinx FPGA XC7K420T-1FFG1156&#xff0c;1片X…

【ROS 2 Humble】 Ubuntu 20.04(Focal)平台 源码安装

提问链接&#xff1a; https://answers.ros.org/questions/ —————————————— ROS 1 各版本支持截止时间查看 ROS 1 支持时间查看 链接 https://wiki.ros.org/Distributions ROS 2 各版本支持截止时间查看 ROS 2 版本支持时间查看 ROS 2 https://docs.ros.…

开赛在即 | 赛宁网安技术支撑第七届“蓝帽杯”决赛

为全面贯彻网络强国重要思想&#xff0c;进一步加强落实网络安全人才战略部署&#xff0c;推动网络安全技术交流发展&#xff0c;促进高校尖端人才培养&#xff0c;提升专职人员安全技能。由公安部网络安全保卫局、教育部教育管理信息中心、中国教育协会指导&#xff0c;中国人…

vue3 列表页开发【选择展示列】功能

目录 背景描述&#xff1a; 开发流程&#xff1a; 详细开发流程&#xff1a; 总结&#xff1a; 背景描述&#xff1a; 这个功能是基于之前写的 封装列表页 的功能继续写的&#xff0c;加了一个选择展示列的功能&#xff0c;可以随时控制表格里展示那些列的数据&#xf…

榜样力量激发青少年英语学习新活力

近日,在第二届iEnglish英语风采秀总决选中,12岁的天津女孩田丽雨以出色的英语能力和生动表演赢得了年度舞台之星的称号。田丽雨的英语学习方法引发了社会各界的广泛关注,尤其是她以身边榜样为动力,借助智能英语学习工具iEnglish实现了英语自由阅读和无障碍交流的目标。 据中国青…

[数据挖掘、数据分析] clickhouse在go语言里的实践

系列文章目录 [数据挖掘] clickhouse在go语言里的实践 [数据挖掘] 用户画像平台构建与业务实践 文章目录 系列文章目录前言一、clickhouse的起源二、OLAP/OLTP2.1、主流的OLAP/OLTP数据库 三、go语言开发实践3.1、安装配置go语言环境&#xff0c;配置IDE3.1.1、Go开发环境安装…