宣威做网站建设的公司网站栏目结构哪些

张小明 2025/12/27 21:45:16
宣威做网站建设的公司,网站栏目结构哪些,下载模板,网站建设流程图visioJava 对异步操作的支持随版本迭代不断完善#xff0c;从早期的手动线程管理#xff0c;到 Java 8 引入的 CompletableFuture#xff08;核心#xff09;#xff0c;再到异步 IO、框架层面的封装#xff0c;形成了一套覆盖 “基础线程异步→异步结果编排→异步 IO→业务层…Java 对异步操作的支持随版本迭代不断完善从早期的手动线程管理到 Java 8 引入的CompletableFuture核心再到异步 IO、框架层面的封装形成了一套覆盖 “基础线程异步→异步结果编排→异步 IO→业务层异步” 的完整体系。本文从核心实现、实战示例、特性解析、避坑指南四个维度全面讲解 Java 异步操作。一、Java 异步的核心目标与演进1. 核心目标解决同步操作中 “IO 阻塞导致线程闲置” 的问题通过异步化提升线程利用率和系统吞吐量尤其适用于 IO 密集型场景如网络请求、数据库操作、文件读写。2. 演进历程阶段技术方案核心问题早期Java 5 前Thread Runnable手动管理线程无返回值无法优雅处理结果进阶Java 5Future ExecutorService支持返回值但无法链式调用、组合任务核心Java 8CompletableFuture支持链式调用、任务组合、非阻塞回调异步 IOJava 7NIO.2 (AsynchronousFileChannel)文件 / 网络 IO 异步化框架层SpringAsync注解业务层异步化屏蔽底层线程管理二、核心异步实现方式附实战示例1. 基础Thread Runnable/Callable手动异步这是 Java 最底层的异步实现直接通过创建线程执行任务适用于简单异步场景但需手动管理线程生命周期开销大、易失控。示例 1无返回值异步Runnable// 异步任务无返回值 Runnable asyncTask () - { try { // 模拟 IO 操作如数据库查询 Thread.sleep(1000); System.out.println(异步任务执行完成Runnable Thread.currentThread().getName()); } catch (InterruptedException e) { Thread.currentThread().interrupt(); throw new RuntimeException(e); } }; // 启动异步线程 new Thread(asyncTask, Async-Thread-1).start(); System.out.println(主线程继续执行不等待异步任务);示例 2有返回值异步Callable FutureCallable支持返回值结合Future可获取异步结果但Future.get()是阻塞式的import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; // 有返回值的异步任务 CallableString callableTask () - { Thread.sleep(1000); return 异步任务结果 Thread.currentThread().getName(); }; // 创建线程池避免手动创建线程 ExecutorService executor Executors.newSingleThreadExecutor(); // 提交任务返回 Future结果占位符 FutureString future executor.submit(callableTask); // 主线程继续执行 System.out.println(主线程执行其他逻辑...); try { // 阻塞获取异步结果若任务未完成主线程会等待 String result future.get(); System.out.println(获取异步结果 result); } catch (Exception e) { e.printStackTrace(); } finally { // 关闭线程池 executor.shutdown(); }缺点Future.get()是阻塞操作无法实现 “任务完成后自动回调”不支持任务组合如 “任务 A 完成后执行任务 B”无内置异常处理机制手动管理线程池易出现资源泄露。2. 核心CompletableFutureJava 8 推荐CompletableFuture是Future的增强版实现了CompletionStage接口支持链式调用、任务组合、非阻塞回调、超时控制是 Java 异步编程的核心工具。核心特性方法分类核心方法作用创建异步任务supplyAsync()/runAsync()前者有返回值后者无返回值链式处理结果thenApply()/thenAccept()处理上一步结果同步异步链式处理thenApplyAsync()/thenAcceptAsync()异步处理上一步结果任务组合thenCompose()/thenCombine()串行组合 / 并行组合多任务聚合allOf()/anyOf()等待所有任务完成 / 任意一个任务完成异常处理exceptionally()/whenComplete()异常兜底 / 完成成功 / 失败回调超时控制orTimeout()/completeOnTimeout()超时抛出异常 / 超时返回默认值示例 1基础异步任务有返回值import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; // 自定义线程池推荐避免使用默认 ForkJoinPool ExecutorService customExecutor Executors.newFixedThreadPool(5); // 1. supplyAsync异步执行有返回值的任务 CompletableFutureString future CompletableFuture.supplyAsync(() - { try { Thread.sleep(1000); return 异步任务执行完成; } catch (InterruptedException e) { throw new RuntimeException(任务被中断, e); } }, customExecutor); // 指定线程池可选默认用 ForkJoinPool.commonPool() // 2. 非阻塞回调任务完成后自动处理结果 future.thenAccept(result - { System.out.println(回调处理结果 result); }).exceptionally(ex - { // 异常兜底 System.err.println(任务执行失败 ex.getMessage()); return null; }); // 主线程不阻塞继续执行 System.out.println(主线程执行其他逻辑...); // 等待任务完成仅示例实际不建议阻塞 future.join(); // 关闭线程池 customExecutor.shutdown();示例 2任务组合串行 并行串行组合thenCompose任务 B 依赖任务 A 的结果// 任务 A获取用户 ID CompletableFutureString getUserId CompletableFuture.supplyAsync(() - { Thread.sleep(500); return user_123; }); // 任务 B根据用户 ID 获取用户信息依赖任务 A 的结果 CompletableFutureString getUserInfo getUserId.thenCompose(userId - { return CompletableFuture.supplyAsync(() - { Thread.sleep(500); return 用户信息 userId 姓名张三; }); }); // 处理最终结果 getUserInfo.thenAccept(info - System.out.println(最终结果 info)); getUserInfo.join();并行组合thenCombine任务 A 和 B 并行执行结果合并// 任务 A计算 12 CompletableFutureInteger taskA CompletableFuture.supplyAsync(() - { Thread.sleep(500); return 1 2; }); // 任务 B计算 34 CompletableFutureInteger taskB CompletableFuture.supplyAsync(() - { Thread.sleep(500); return 3 4; }); // 合并结果A B CompletableFutureInteger combinedTask taskA.thenCombine(taskB, (a, b) - a b); combinedTask.thenAccept(total - System.out.println(合并结果 total)); // 输出 10 combinedTask.join();示例 3多任务聚合allOf /anyOfallOf等待所有任务完成无返回值需手动获取每个任务结果CompletableFutureString task1 CompletableFuture.supplyAsync(() - { Thread.sleep(500); return 任务1结果; }); CompletableFutureString task2 CompletableFuture.supplyAsync(() - { Thread.sleep(800); return 任务2结果; }); CompletableFutureString task3 CompletableFuture.supplyAsync(() - { Thread.sleep(600); return 任务3结果; }); // 等待所有任务完成 CompletableFutureVoid allTasks CompletableFuture.allOf(task1, task2, task3); // 所有任务完成后处理结果 allTasks.thenRun(() - { System.out.println(所有任务完成); System.out.println(task1.join()); System.out.println(task2.join()); System.out.println(task3.join()); }); allTasks.join();anyOf任意一个任务完成即返回CompletableFutureString fastTask CompletableFuture.supplyAsync(() - { Thread.sleep(300); return 快速任务结果; }); CompletableFutureString slowTask CompletableFuture.supplyAsync(() - { Thread.sleep(1000); return 慢速任务结果; }); // 任意一个任务完成即处理 CompletableFutureObject anyTask CompletableFuture.anyOf(fastTask, slowTask); anyTask.thenAccept(result - System.out.println(第一个完成的任务结果 result)); // 输出“快速任务结果” anyTask.join();示例 4超时控制与异常处理CompletableFutureString timeoutTask CompletableFuture.supplyAsync(() - { try { Thread.sleep(2000); // 模拟耗时任务 return 任务完成; } catch (InterruptedException e) { throw new RuntimeException(e); } }); // 超时控制1秒后超时抛出异常 timeoutTask.orTimeout(1, java.util.concurrent.TimeUnit.SECONDS) // 异常兜底 .exceptionally(ex - { System.err.println(任务超时/失败 ex.getMessage()); return 默认兜底结果; }) // 无论成功/失败最终执行 .whenComplete((result, ex) - { System.out.println(最终结果 result); }) .join();3. 异步 IONIO.2AsynchronousFileChannelJava 7 引入 NIO.2提供AsynchronousFileChannel支持文件异步读写适用于大文件 IO 场景避免线程阻塞。示例异步读取文件import java.nio.ByteBuffer; import java.nio.channels.AsynchronousFileChannel; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; import java.util.concurrent.Future; public class AsyncFileReadExample { public static void main(String[] args) throws Exception { // 打开异步文件通道 Path filePath Paths.get(test.txt); AsynchronousFileChannel fileChannel AsynchronousFileChannel.open( filePath, StandardOpenOption.READ ); // 分配缓冲区 ByteBuffer buffer ByteBuffer.allocate(1024); // 异步读取文件返回 Future FutureInteger readFuture fileChannel.read(buffer, 0); // 从位置 0 开始读取 // 主线程继续执行 System.out.println(主线程执行其他操作...); // 等待读取完成 int bytesRead readFuture.get(); System.out.println(读取字节数 bytesRead); // 切换缓冲区为读模式 buffer.flip(); // 输出读取内容 while (buffer.hasRemaining()) { System.out.print((char) buffer.get()); } // 关闭通道 fileChannel.close(); } }4. 框架层Spring Async业务层异步Spring 提供Async注解可快速将普通方法转为异步执行底层封装了线程池和CompletableFuture简化业务层异步开发。步骤 1开启异步支持配置类import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableAsync; Configuration EnableAsync // 开启异步支持 public class AsyncConfig { // 自定义异步线程池推荐避免默认线程池耗尽 Bean(name asyncExecutor) public Executor asyncExecutor() { ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor(); executor.setCorePoolSize(5); // 核心线程数 executor.setMaxPoolSize(10); // 最大线程数 executor.setQueueCapacity(20); // 队列容量 executor.setThreadNamePrefix(Spring-Async-); // 线程名前缀 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); // 拒绝策略 executor.initialize(); return executor; } }步骤 2定义异步方法import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import java.util.concurrent.CompletableFuture; Service public class AsyncService { // 指定自定义线程池返回 CompletableFuture 支持后续处理 Async(asyncExecutor) public CompletableFutureString asyncMethod(String param) { try { Thread.sleep(1000); return CompletableFuture.completedFuture(异步方法执行完成 param); } catch (InterruptedException e) { return CompletableFuture.failedFuture(e); } } }步骤 3调用异步方法import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.event.EventListener; SpringBootApplication public class AsyncApplication { Autowired private AsyncService asyncService; public static void main(String[] args) { SpringApplication.run(AsyncApplication.class, args); } EventListener(ApplicationReadyEvent.class) public void testAsync() { // 调用异步方法 CompletableFutureString future asyncService.asyncMethod(test123); // 非阻塞处理结果 future.thenAccept(result - System.out.println(异步方法结果 result)) .exceptionally(ex - { System.err.println(异步方法失败 ex.getMessage()); return null; }); System.out.println(主线程继续执行...); } }三、Java 异步的关键注意事项1. 线程池选型核心避坑点避免使用默认线程池CompletableFuture.supplyAsync()默认使用ForkJoinPool.commonPool()该线程池是全局共享的若被阻塞任务占满会影响其他异步任务自定义线程池规范核心线程数IO 密集型场景设为2 * CPU 核心数CPU 密集型设为CPU 核心数 1拒绝策略避免使用默认的AbortPolicy直接抛异常推荐CallerRunsPolicy由调用线程执行避免任务丢失必须手动关闭线程池或使用 Spring 托管的线程池防止资源泄露。2. 异常处理CompletableFuture的异常不会主动抛出若未通过exceptionally()/whenComplete()处理会导致异常 “静默丢失”多任务聚合allOf()时单个任务异常不会终止其他任务需逐个检查任务状态。3. 避免过度异步简单顺序任务无需异步线程调度开销会降低性能CPU 密集型任务不适合纯异步CompletableFuture基于线程池CPU 密集型任务会占满线程池导致 IO 任务阻塞建议用ForkJoinPool做并行计算。4. 资源释放异步任务中打开的资源如数据库连接、文件通道、网络连接需在finally或whenComplete()中关闭SpringAsync方法若抛出未捕获异常需通过CompletableFuture封装否则异常无法感知。5. 避免竞态条件多个异步任务修改共享变量时需使用线程安全类如AtomicInteger、ConcurrentHashMap或加锁ReentrantLock优先用 “通信代替共享”如通过CompletableFuture传递结果而非共享变量。四、适用场景异步方式适用场景CompletableFuture业务层异步任务、多任务组合、非阻塞回调AsynchronousFileChannel大文件异步读写、高并发文件 IOSpringAsync业务层简单异步如邮件发送、日志记录、数据同步Future ExecutorService简单异步任务无组合 / 回调需求五、总结Java 异步操作的核心是CompletableFuture它解决了传统Future的阻塞、无法组合的问题是 IO 密集型场景的首选AsynchronousFileChannel专注于异步 IOSpringAsync则简化了业务层异步开发。使用 Java 异步的核心原则优先自定义线程池避免默认线程池的资源竞争必须处理异步任务的异常防止静默失败根据场景选择异步方式简单任务用Async复杂任务用CompletableFuture文件 IO 用AsynchronousFileChannel避免异步嵌套过深保持代码可读性。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

企业网站的建立多少钱社交网站开发流程

目录已开发项目效果实现截图开发技术系统开发工具:核心代码参考示例1.建立用户稀疏矩阵,用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式&…

张小明 2025/12/25 10:45:45 网站建设

做宣传用什么网站好在服务器上运行wordpress

简介 文章基于麦肯锡报告,探讨了AI时代工作模式的根本性变革,提出"人智能体机器人"的新工作范式。指出人类仍是核心生产力,但技能结构正在快速迁移,AI应用能力成为新时代基础技能。未来工作不是被AI替代,而是…

张小明 2025/12/25 16:59:52 网站建设

三河网站建设公司如何用wordpress插件

基于Spring Boot的公司公务用车管理系统是一种高效、灵活且易于扩展的车辆管理解决方案。以下是对该系统的详细介绍: 一、系统背景与目的 随着公司规模的扩大和公务用车数量的增加,传统的人工管理方法已经难以满足高效、准确的管理需求。因此&#xff0c…

张小明 2025/12/25 17:12:24 网站建设

网络服务器与网站建设网站占有率

数字电路实验与DCS系统集成:从实验室到工业现场的硬核跃迁你有没有遇到过这样的场景?一台关键设备突然跳停,操作员翻遍报警记录却找不到明确原因;事后排查发现,原来是某个开关量信号抖动了不到10毫秒——刚好躲过了软件…

张小明 2025/12/25 16:44:05 网站建设

东莞制作网站公司哪家好购物网站开发的意义和目的

先利其器 虚拟环境与pytest配置 首先你需要准备好pycharm,并且安装好python环境。(mac基本都自带python,3.7.8及其以后的版本都可用)。然后按照以下步骤,配置好虚拟环境。 本文档是教程,不会涉及到具体的…

张小明 2025/12/25 16:58:22 网站建设

网站制作例子合同模板网站

使用手机时,我们经常需要录制屏幕操作:比如保存无法下载的视频、制作教学演示、记录游戏高光时刻,或是保存重要通话内容。其实,无论是安卓还是苹果手机,系统都已内置了录屏功能,无需安装第三方App&#xff…

张小明 2025/12/25 17:49:51 网站建设