文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java 的异步编程 (5 种异步实现方式详解)

2023-09-03 08:28

关注

一、线程异步

创建一个异步线程

public class AsyncThread extends Thread{    @Override    public void run() {        System.out.println("当前线程名称:" + this.getName() + ", 执行线程名称:" + Thread.currentThread().getName() + "我是异步线程");    }}

创建主线程,在主线程中创建异步线程执行异步线程,实现异步编程

public static void main(String[] args) {   // 模拟业务流程  // .......      // 创建异步线程     AsyncThread asyncThread = new AsyncThread();     // 启动异步线程    asyncThread.start();}

优化:由于线程的频繁创建和销毁浪费系统资源,我们可以使用线程池进行优化

线程池的使用:创建一个类,将线程池设置为全局变量

puclic class Executor {private ExecutorService executor = Executors.newCachedThreadPool() ;     public void runThread() throws Exception {         executor.submit(new Runnable(){             @override                 public void run() {                     try {                     //要执行的业务代码,我们这里没有写方法,可以让线程休息几秒进行测试                         Thread.sleep(10000);                         System.out.print("睡够啦~");                     }catch(Exception e) {                         throw new RuntimeException("报错啦!!");                     }                 }         });     }}

执行线程时只需要创建执行对象调用执行方法就可以了

二、Future异步

Future异步性能较差不建议使用,由于Future异步获取线程结果会阻塞线程,所以性能较差,不建议使用

三、CompletableFuture异步

JDK1.8 中,Java 提供了 CompletableFuture 类,它是基于异步函数式编程。相对阻塞式等待返回结果,CompletableFuture 可以通过回调的方式来处理计算结果,实现了异步非阻塞,性能更优。

CompletableFuture 实现了 Future 和 CompletionStage 接口, 并提供了多种实现异步编程的方法,如supplyAsync, runAsync以及thenApplyAsync。

下面我们使用CompletableFuture来实现上面的例子:

CompletableFuture completableFuture = CompletableFuture.supplyAsync(() -> factorial(number));while (!completableFuture.isDone()) {    System.out.println("CompletableFuture is not finished yet...");}long result = completableFuture.get();

我们不需要显式使用 ExecutorService,CompletableFuture 内部使用了 ForkJoinPool 来处理异步任务,这使得我们的代码变的更简洁。

四、SpringBoot @Async异步

在@Async注解之前,使用多线程需要使用JDK的原生方法,非常麻烦,当有了@Async之后就比较简单了。

首先,启动类添加@EnableAsync 注解,允许异步:

@SpringBootApplication@EnableAsyncpublic class StartApplication {    public static void main(String[] args) {        SpringApplication.run(StartApplication.class, args);    }}

定义线程池

@Configuration@Slf4jpublic class ThreadPoolConfiguration {    @Bean(name = "defaultThreadPoolExecutor", destroyMethod = "shutdown")    public ThreadPoolExecutor systemCheckPoolExecutorService() {        return new ThreadPoolExecutor(3, 10, 60, TimeUnit.SECONDS,                new LinkedBlockingQueue(10000),                new ThreadFactoryBuilder().setNameFormat("default-executor-%d").build(),                (r, executor) -> log.error("system pool is full! "));    }}

在异步处理的方法上添加注解 @Async ,当对 execute 方法 调用时,通过自定义的线程池 defaultThreadPoolExecutor 异步化执行  execute 方法

@Servicepublic class AsyncServiceImpl implements AsyncService {     @Async("defaultThreadPoolExecutor")    public Boolean execute(Integer num) {        System.out.println("线程:" + Thread.currentThread().getName() + " , 任务:" + num);        return true;    } }

用 @Async 注解标记的方法,称为异步方法。在spring boot应用中使用 @Async 很简单:

    调用异步方法类上或者启动类加上注解 @EnableAsync

    在需要被异步调用的方法外加上 @Async

    所使用的 @Async 注解方法的类对象应该是Spring容器管理的bean对象;

不知道咋用

 

来源地址:https://blog.csdn.net/a18372016358/article/details/129530991

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯