知方号

知方号

Java 的异步编程 (5 种异步实现方式详解)<怎么实现异步多线程追踪的方法>

一、线程异步

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 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对象;

五、Guava异步 

不知道咋用

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。