首页>>后端>>java->Java如何实现异步处理

Java如何实现异步处理

时间:2023-12-02 本站 点击:0

在实际项目当中,经常用到异步处理,今天利用周末时间总结一下。

一、同步调用和异步处理的区别:

同步调用:整个处理过程按顺序执行,每一步必须等到上一步执行完后才能执行\ 异步调用:只是发送了调用的指令,调用者无需等待被调用的方法完全执行完毕,继续执行下面的流程。

异步实现方式

方式一:

1.newThread((newRunnable(){1.@Override1.publicvoidrun(){1.//批量同步数据1.try{1.logger.info("^^^^^^^^^^^^^^^^^syncstart^^^^^^^^^^^^^^^^^");1.1.logger.info("^^^^^^^^^^^^^^^^^syncend^^^^^^^^^^^^^^^^^");1.}catch(IOExceptione){1.LogUtils2.error("",e);1.}1.}1.})).start();

方式2:

privateExecutorServiceexecutor=Executors.newFixedThreadPool(1);executor.submit(newRunnable(){@Overridepublicvoidrun(){//批量同步数据try{logger.info("^^^^^^^^^^^^^^^^^syncweinxidatastart^^^^^^^^^^^^^^^^^");weiXinUsersService.batchSaveHandle();logger.info("^^^^^^^^^^^^^^^^^syncweinxidataend^^^^^^^^^^^^^^^^^");}catch(IOExceptione){LogUtils2.error("",e);}}});

方式3:@EnableAsync和@Async注解

异步注解 @EnableAsync :开启异步方法的支持

@Async 异步方法

@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Import({AsyncConfigurationSelector.class})public@interfaceEnableAsync{Class<?extendsAnnotation>annotation()defaultAnnotation.class;booleanproxyTargetClass()defaultfalse;AdviceModemode()defaultAdviceMode.PROXY;intorder()default2147483647;}

@EnableAsync用于开启异步方法的支持。只有开启了异步方法的支持才可以使用@Async`。

一、开启异步:@ENABLEASYNC

@EnableAsync@SpringBootApplicationpublicclassApplication{publicstaticvoidmain(String[]args){SpringApplication.run(Application.class,args);}}

@EnableAsync可以让Spring启用异步方法执行,就跟在xml中配置[task:*]()效果是一样的。它可以跟@Configuration结合,让整个Spring环境启用基于注解的异步处理:

importjava.util.concurrent.Executor;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.scheduling.annotation.EnableAsync;importorg.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;importcom.google.gson.Gson;importcom.google.gson.GsonBuilder;@Configuration@EnableAsync@SuppressWarnings(value="Duplicates")publicclassAppConfig{publicstaticfinalStringASYNC_EXECUTOR_NAME="asyncExecutor";@Bean(name=ASYNC_EXECUTOR_NAME)publicExecutorasyncExecutor(){ThreadPoolTaskExecutorexecutor=newThreadPoolTaskExecutor();//forpassinginrequestscopecontextexecutor.setTaskDecorator(newContextCopyingDecorator());executor.setCorePoolSize(3);executor.setMaxPoolSize(5);executor.setQueueCapacity(100);executor.setWaitForTasksToCompleteOnShutdown(true);executor.setThreadNamePrefix("AsyncThread-");executor.initialize();returnexecutor;}@BeanpublicGsongson(){returnnewGsonBuilder().setDateFormat("yyyy-MM-ddHH:mm:ss").create();}

为什么要给@ASYNC自定义线程池?

@Async注解,在默认情况下用的是SimpleAsyncTaskExecutor线程池,该线程池不是真正意义上的线程池,因为线程不重用,每次调用都会新建一条线程。

@Async注解异步框架提供多种线程

SimpleAsyncTaskExecutor:不是真的线程池,这个类不重用线程,每次调用都会创建一个新的线程。

SyncTaskExecutor:这个类没有实现异步调用,只是一个同步操作。只适用于不需要多线程的地方

ConcurrentTaskExecutor:Executor的适配类,不推荐使用。如果ThreadPoolTaskExecutor不满足要求时,才用考虑使用这个类

ThreadPoolTaskScheduler:可以使用cron表达式

ThreadPoolTaskExecutor :最常使用,推荐。 其实质是对java.util.concurrent.ThreadPoolExecutor的包装

举例:

@EnableAsyncpublicclassWeiXinUsersServiceextendsBaseGongfuService{@AsyncpublicvoidbatchSaveHandle()throwsIOException}}

@Async`可以把某一个方法或者类下面的方法全部变成异步处理的方法。

参考文章

https://www.cnblogs.com/RuMengkai/p/10108503.html

SpringBoot异步执行:@ENABLEASYNC、@ASYNC

异步框架@ASYNC @ENABLEASYNC

SPRING的@ENABLEASYNC与@ASYNC使用详解

SPRINGBOOT 中使用异步线程池 @ENABLEASYNC @ASYNC


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/java/10421.html