Java 异步编程实践_动力节点Java学院整理

发布时间 - 2026-01-11 01:26:33    点击率:

什么是异步?为什么要用它?

异步编程提供了一个非阻塞的,事件驱动的编程模型。 这种编程模型利用系统中多核执行任务来提供并行,因此提供了应用的吞吐率。此处吞吐率是指在单位时间内所做任务的数量。 在这种编程方式下, 一个工作单元将独立于主应用线程而执行, 并且会将它的状态通知调用线程:成功,处理中或者失败。

我们需要异步来消除阻塞模型。其实异步编程模型可以使用同样的线程来处理多个请求, 这些请求不会阻塞这个线程。想象一个应用正在使用的线程正在执行任务, 然后等待任务完成才进行下一步。 log框架就是一个很好的例子:典型地你想将异常和错误日志记录到一个目标中, 比如文件,数据库或者其它类似地方。你不会让你的程序等待日志写完才执行,否则程序的响应就会受到影响。 相反,如果对log框架的调用是异步地,应用就可以并发执行其它任务而无需等待。这是一个非阻塞执行的例子。

为了在Java中实现异步,你需要使用Future 和 FutureTask, 它们位于java.util.concurrent包下. Future是一个接口而FutureTask是它的一个实现类。实际上,如果在你的代码中使用Future, 你的异步任务会立即执行, 并且调用线程可以得到结果promise。

下面的代码片段定义了一个包含两个方法的接口。 一个是同步方法,另外一个是异步方法。

 import java.util.concurrent.Future;
public interface IDataManager {
  // synchronous method
  public String getDataSynchronously();
  // asynchronous method
  public Future<String> getDataAsynchronously();
}

值得注意的是回调模型的弊端就是当回调嵌套时很麻烦。

该做和不该做的

为了方便测试, 你应该在代码中将功能从多线程中隔离出来。当在Java中编写异步代码时,你应该遵循异步模型,这样调用线程就不会被阻塞。

注意构造函数不能是异步的,你不应该在构造函数中调用异步方法。当任务互相不依赖时异步方式尤其有用。当调用任务依赖被调用任务时不应该使用异步(译者按:这对异步来说无意义,因为业务上调用线程被阻塞了).

你应该在异步方法中处理异常. 你不应该为长时间的task实现异常. 一个长时间运行的任务,如果异步执行的话, 可能会比同步执行耗费更长的时间, 因为运行时要为异步执行的方法执行线程上下文的切换, 线程状态的存储等. 你也应该注意同步的异常和异步的异常有所不同。 同步异常暗示 每次程序执行到那个程序特殊状态时就会抛出异常;异步异常的跟踪则困难的多。所以同步和异步异常暗示同步或异步代码可能抛出异常(synchronous and asynchronous exceptions imply synchronous or asynchronous code in your program that might raise exceptions.)。

总结

异步对于设计大规模快速响应的应用是至关重要的。异步回调模型带来了很多的好处;你可以依赖你的异步回调方法来执行昂贵的I/O操作而你的处理器可以执行其它任务。然而虽然在Java和C#中提供了异步的支持,异步编程并不总是那么容易实现。异步方式的使用要谨慎: 你应该清楚什么时候可以用和什么时候不该用。

本文中我们介绍了异步编程的概念, 以及使用Java编程需要怎么去实现. 本文也列出了使用异步编程的最佳实践。谢谢阅读。

Java 7中提供了Fork/Join框架, 可以将一个大的task分割成很多可以并行执行的小task。Java 8中parallelStream内部利用Fork/Join执行并发操作。

像Node.js天生支持异步编程模式, 其它语言如golang使用 goroutines 和 channels.也很容易实现异步。


# java  # 异步编程  # java异步编程之一文看完其异步函数表  # java异步编程CompletableFuture使用示例详解  # Java异步编程工具Twitter Future详解  # Java 8 的异步编程利器 CompletableFuture的实例详解  # Java并发 CompletableFuture异步编程的实现  # Java8新的异步编程方式CompletableFuture实现  # java异步编程详解  # java异步编程的7种实现方式小结  # 你应该  # 回调  # 你不  # 什么时候  # 长时间  # 多核  # 抛出  # 该做  # 的是  # 是一个  # 就会  # 很好  # 出了  # 你可以  # 多个  # 你也  # 是指  # 可以用  # 这是一个  # 时间内 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  如何在Windows 2008云服务器安全搭建网站?  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  如何正确下载安装西数主机建站助手?  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  Laravel怎么在Controller之外的地方验证数据  免费视频制作网站,更新又快又好的免费电影网站?  如何破解联通资金短缺导致的基站建设难题?  浅谈javascript alert和confirm的美化  如何在云虚拟主机上快速搭建个人网站?  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  Java遍历集合的三种方式  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  Laravel如何实现本地化和多语言支持?(i18n教程)  北京专业网站制作设计师招聘,北京白云观官方网站?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  如何用景安虚拟主机手机版绑定域名建站?  千库网官网入口推荐 千库网设计创意平台入口  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  C++时间戳转换成日期时间的步骤和示例代码  JS实现鼠标移上去显示图片或微信二维码  如何用AI帮你把自己的生活经历写成一个有趣的故事?  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  在Oracle关闭情况下如何修改spfile的参数  Python面向对象测试方法_mock解析【教程】  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  如何用已有域名快速搭建网站?  使用豆包 AI 辅助进行简单网页 HTML 结构设计  Laravel如何使用Sanctum进行API认证?(SPA实战)  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  Laravel如何实现一对一模型关联?(Eloquent示例)  Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】  Laravel如何实现API速率限制?(Rate Limiting教程)  如何用IIS7快速搭建并优化网站站点?  使用spring连接及操作mongodb3.0实例  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  如何基于云服务器快速搭建网站及云盘系统?  Android仿QQ列表左滑删除操作  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  如何用花生壳三步快速搭建专属网站?  北京网站制作公司哪家好一点,北京租房网站有哪些?