Java 中实现异步的方式

news2024/11/27 23:17:54

在 Java 中实现异步处理有多种方式,每种方式都有其特定的适用场景和优缺点。以下是几种常见的实现异步处理的方式:

1. 线程池(ExecutorService

  • 简介:使用 ExecutorService 可以创建线程池来执行异步任务。
  • 优点:资源复用、线程管理方便。
  • 缺点:需要手动管理线程池的生命周期。
  • 示例
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class ThreadPoolExample {
        public static void main(String[] args) {
            ExecutorService executor = Executors.newFixedThreadPool(2);
    
            Runnable task1 = () -> {
                System.out.println("Task 1 running in thread: " + Thread.currentThread().getName());
            };
    
            Runnable task2 = () -> {
                System.out.println("Task 2 running in thread: " + Thread.currentThread().getName());
            };
    
            executor.execute(task1);
            executor.execute(task2);
    
            executor.shutdown();
        }
    }
    

2. CompletableFuture

  • 简介CompletableFuture 是 Java 8 引入的一个强大的异步编程工具,支持链式调用和组合操作。
  • 优点:功能丰富、易于组合多个异步操作。
  • 缺点:学习曲线较陡峭。
  • 示例
    import java.util.concurrent.CompletableFuture;
    
    public class CompletableFutureExample {
        public static void main(String[] args) {
            CompletableFuture.supplyAsync(() -> {
                System.out.println("Task 1 running in thread: " + Thread.currentThread().getName());
                return "Result 1";
            }).thenApply(result -> {
                System.out.println("Task 2 running in thread: " + Thread.currentThread().getName());
                return result + " processed";
            }).thenAccept(finalResult -> {
                System.out.println("Final result: " + finalResult);
            });
    
            // 防止主线程提前结束
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    

3. ForkJoinPool

  • 简介ForkJoinPool 是一个特殊的线程池,适用于可以分解成多个子任务并行处理的场景。
  • 优点:适合处理大量细粒度的任务。
  • 缺点:适用于特定类型的任务,不适用于所有异步场景。
  • 示例
    import java.util.concurrent.ForkJoinPool;
    import java.util.concurrent.RecursiveTask;
    
    public class ForkJoinExample extends RecursiveTask<Integer> {
        private final int threshold = 2;
        private final int start;
        private final int end;
    
        public ForkJoinExample(int start, int end) {
            this.start = start;
            this.end = end;
        }
    
        @Override
        protected Integer compute() {
            if (end - start <= threshold) {
                int sum = 0;
                for (int i = start; i < end; i++) {
                    sum += i;
                }
                return sum;
            } else {
                int middle = (start + end) / 2;
                ForkJoinExample subtask1 = new ForkJoinExample(start, middle);
                ForkJoinExample subtask2 = new ForkJoinExample(middle, end);
    
                subtask1.fork();
                subtask2.fork();
    
                return subtask1.join() + subtask2.join();
            }
        }
    
        public static void main(String[] args) {
            ForkJoinPool pool = new ForkJoinPool();
            ForkJoinExample task = new ForkJoinExample(1, 100);
            int result = pool.invoke(task);
            System.out.println("Result: " + result);
        }
    }
    

4. CallableFuture

  • 简介Callable 是一个可以返回结果并可能抛出异常的任务,Future 用于获取 Callable 的执行结果。
  • 优点:可以获取任务的执行结果。
  • 缺点:需要手动管理线程和任务的生命周期。
  • 示例
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Future;
    
    public class CallableFutureExample {
        public static void main(String[] args) {
            ExecutorService executor = Executors.newSingleThreadExecutor();
    
            Callable<Integer> task = () -> {
                Thread.sleep(2000);
                return 42;
            };
    
            Future<Integer> future = executor.submit(task);
    
            try {
                Integer result = future.get();
                System.out.println("Result: " + result);
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            }
    
            executor.shutdown();
        }
    }
    

5. ScheduledExecutorService

  • 简介ScheduledExecutorService 是一个可以调度延迟任务和周期性任务的线程池。
  • 优点:适合定时任务和周期性任务。
  • 缺点:功能相对单一。
  • 示例
    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.TimeUnit;
    
    public class ScheduledExecutorExample {
        public static void main(String[] args) {
            ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    
            Runnable task = () -> {
                System.out.println("Task running in thread: " + Thread.currentThread().getName());
            };
    
            // 延迟2秒后执行任务
            scheduler.schedule(task, 2, TimeUnit.SECONDS);
    
            // 每隔1秒执行一次任务
            scheduler.scheduleAtFixedRate(task, 0, 1, TimeUnit.SECONDS);
    
            // 防止主线程提前结束
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            scheduler.shutdown();
        }
    }
    

总结

  • 线程池ExecutorService):适用于一般的异步任务。
  • CompletableFuture:适用于复杂的异步操作和链式调用。
  • ForkJoinPool:适用于可以分解成多个子任务并行处理的场景。
  • CallableFuture:适用于需要获取任务结果的场景。
  • ScheduledExecutorService:适用于定时任务和周期性任务。

根据具体需求选择合适的异步处理方式,可以提高程序的性能和可维护性。希望这些示例对你有所帮助!如果有更多问题或需要进一步的帮助,请随时提问。

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

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

相关文章

Redis设计与实现 学习笔记 第二十章 Lua脚本

Redis从2.6版本引入对Lua脚本的支持&#xff0c;通过在服务器中嵌入Lua环境&#xff0c;Redis客户端可以使用Lua脚本&#xff0c;直接在服务器端原子地执行多个Redis命令。 其中EVAL命令可以直接对输入的脚本进行求值&#xff1a; 而使用EVALSHA命令则可以根据脚本的SHA1校验…

C# 调用系统级方法复制、移动和删除等操作界面

有时候需要在程序复制、移动、删除文件等操作&#xff0c;虽然实现的方法有很多&#xff0c;但有些时候真的不如系统自带的界面效果来的直接省事。 好了不啰嗦了&#xff0c;直接看代码。这是网上找的&#xff0c;能用&#xff0c;但是有一点bug&#xff0c;有时候第一次复制文…

AI赋能电商:打造高效销售与卓越用户体验的新引擎

在数字经济迅猛发展的今天&#xff0c;电商行业正处于持续演变的关键时期。技术的进步不仅重塑了电商生态的运行方式&#xff0c;也在深刻改变用户的消费习惯。人工智能&#xff08;AI&#xff09;作为现代科技的核心驱动力&#xff0c;为电商平台提供了前所未有的工具和机遇。…

基于机器视觉的表面缺陷检测

基于机器视觉的表面缺陷检测存在的问题与难点 - AVT相机|AVT红外相机|万兆网相机EVT|VIEWORKS线扫相|映美精相机|Specim多光谱相机|Adimec相机|Basler相机|富士能FUJINON镜头|理光RICOH镜头|OPTO远心镜头|SPO远心镜头|Navtar镜头|VST镜头|CCS光源|3D视觉引导机床上下料系统 (完…

Fakelocation Server服务器/专业版 Windows11

前言:需要Windows11系统 Fakelocation开源文件系统需求 Windows11 | Fakelocation | 任务一 打开 PowerShell&#xff08;以管理员身份&#xff09;命令安装 Chocolatey Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProto…

【Android】View的解析—滑动篇

1.View与ViewGroup View&#xff1a; View是Android中所有UI组件的基类&#xff0c;提供了绘制&#xff08;draw&#xff09;、布局&#xff08;layout&#xff09;和事件处理&#xff08;event handling&#xff09;的基础功能。它是一个抽象类&#xff0c;不能直接实例化&…

极狐GitLab 17.6 正式发布几十项与 DevSecOps 相关的功能【三】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…

基于混合ABC和A*算法复现

基于混合ABC和A*算法复现 一、背景介绍二、算法原理&#xff08;一&#xff09;A*算法原理&#xff08;二&#xff09;人工蜂群算法原理&#xff08;三&#xff09;混合ABC和A*算法策略 三、代码实现&#xff08;一&#xff09;数据准备&#xff08;二&#xff09;关键函数实现…

linux运行vue编译后的项目

如果你的 Vue 项目使用了 history 模式&#xff08;而非默认的 hash 模式&#xff09;&#xff0c;在纯静态服务器中会出现类似的问题。因为 Vue Router 的 history 模式要求所有未匹配的路径都重定向到 index.html&#xff0c;以便 Vue 前端处理路径。 首先在本地执行npm run…

模拟实现Bash

模拟实现Bash 1.Bash基本认识2.Bash实现3.添加细节4.内置命令5.完整代码 &#x1f31f;&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f;&#x1f31f; &#x1f680;&#x1f680;系列专栏&#xff1a;【Linux的学习】 &#x1f4dd;&#x1f4dd;本篇内容…

sql注入报错分享(mssql+mysql)

mysql mysql的报错内容比较多 网上也有比较多的 这里重复的就不多介绍了。一笔带过 溢出类 bigint 当超过mysql的整形的时候&#xff0c;就会导致溢出&#xff0c;mysql可能会将错误信息带出。这里user()是字母默认为0 取反以后1可能就会导致异常。 报错特征 BIGINT UNSIG…

Hadoop3.3.6集群安装

Hadoop3.3.6 三节点集群安装 准备工作 准备三台机器&#xff0c;大小为4c8g&#xff0c;主节点为 8c16g。并需要保证网络连通性&#xff0c;每台机器都相互ping一下 1、关闭网络防火墙 # 查看网络防火墙状态 sudo systemctl status firewalld # 立即停止 firewalld sudo sy…

如何制作项目网页

一、背景 许多论文里经常会有这样一句话Supplementary material can be found at https://hri-eu.github.io/Lami/&#xff0c;这个就是将论文中的内容或者补充视频放到一个网页上&#xff0c;以更好的展示他们的工作。因此&#xff0c;这里介绍下如何使用前人提供的模板制作我…

JVM调优篇之JVM基础入门AND字节码文件解读

目录 Java程序编译class文件内容常量池附录-访问标识表附录-常量池类型列表 Java程序编译 Java文件通过编译成class文件后&#xff0c;通过JVM虚拟机解释字节码文件转为操作系统执行的二进制码运行。 规范 Java虚拟机有自己的一套规范&#xff0c;遵循这套规范&#xff0c;任…

已存大量数据的mysql库实现主从各种报错----解决方案(看评论)

背景何谓“先死后生”本文使用技术1、实施流程图2、实施2.1、数据库备份2.2、搭建Mysql的Master-Slave2.2.1、准备工作2.2.2、开始部署2.2.3、账号配置2.2.4、slave 同步配置2.2.5、验证 2.3、Master做数据恢复 结语 背景 计划对已有大量数据的mysql库的主从搭建&#xff0c;使…

数据结构 【双向哨兵位循环链表】

链表的结构分为8中&#xff0c;其实搞懂了单链表和双向哨兵位循环链表&#xff0c;这部分的知识也就掌握的差不多了。双向哨兵位循环链表的结构如下&#xff1a; 下面我从0构建一个双向哨兵位循环链表。 1、准备工作 构建节点结构体&#xff0c;双向循环链表的每一个…

高级AI记录笔记(五)

学习位置 B站位置&#xff1a;红豆丨泥 UE AI 教程原作者Youtube位置&#xff1a;https://youtu.be/-t3PbGRazKg?siRVoaBr4476k88gct素材自备 改良近战AI格挡行为 把近战AI的格挡行为从行为树中单独一个任务分块中给删除掉&#xff0c;因为我们希望敌人在受到伤害后立即进行…

彻底解决 macOS 下Matplotlib 中文显示乱码问题

彻底解决 macOS 下Matplotlib 中文显示乱码问题 在使用 Python 的 Matplotlib 库进行数据可视化时&#xff0c;中文字符的显示常常会出现乱码问题&#xff0c;尤其在 macOS 系统上。在网上找了一大堆方法&#xff0c;花了很久&#xff0c;发现不是要安装各种字体就是要改配置&…

11.25.2024刷华为OD

文章目录 HJ76 尼科彻斯定理&#xff08;观察题&#xff0c;不难&#xff09;HJ77 火车进站&#xff08;DFS&#xff09;HJ91 走格子方法&#xff0c;&#xff08;动态规划&#xff0c;递归&#xff0c;有代表性&#xff09;HJ93 数组分组&#xff08;递归&#xff09;语法知识…

突破性算法:让无人机集群在狭窄空间内穿针引线

导读 在建筑救援、森林搜索等任务中&#xff0c;无人机集群经常会遇到狭窄空间限制和动态障碍物变化等挑战。这些挑战会导致集群内部冲突&#xff0c;或在执行任务时因避让动态障碍物而导致系统混乱。实际应用场景和任务的严格特征往往使得全局搜索难以优化&#xff0c;而局部避…