首页 > 基础资料 博客日记

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

2023-08-27 17:49:28基础资料围观202

Java资料网推荐Java 的异步编程 (5 种异步实现方式详解)这篇文章给大家,欢迎收藏Java资料网享受知识的乐趣

一、线程异步

1.创建一个异步线程

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

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

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

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

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

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<Long> 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
@EnableAsync
public class StartApplication {

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

定义线程池

@Configuration
@Slf4j
public class ThreadPoolConfiguration {

    @Bean(name = "defaultThreadPoolExecutor", destroyMethod = "shutdown")
    public ThreadPoolExecutor systemCheckPoolExecutorService() {

        return new ThreadPoolExecutor(3, 10, 60, TimeUnit.SECONDS,
                new LinkedBlockingQueue<Runnable>(10000),
                new ThreadFactoryBuilder().setNameFormat("default-executor-%d").build(),
                (r, executor) -> log.error("system pool is full! "));
    }
}

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

@Service
public 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对象;

五、Guava异步 

不知道咋用

 


文章来源:https://blog.csdn.net/a18372016358/article/details/129530991
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐

标签云