异步,同步的概念以及程序的处理
应用场景
1.同步
同步就是整个处理过程顺序执行,当各个过程都执行完毕,并返回结果。
2. 异步
异步调用则是只是发送了调用的指令,调用者无需等待被调用的方法完全执行完毕;而是继续执行下面的流程。例如, 在某个调用中,需要顺序调用 A, B, C三个过程方法;如他们都是同步调用,则需要将他们都顺序执行完毕之后,方算作过程执行完毕; 如B为一个异步的调用方法,则在执行完A之后,调用B,并不等待B完成,而是执行开始调用C,待C执行完毕之后,就意味着这个过程执行完毕了。在Java中,一般在处理类似的场景之时,都是基于创建独立的线程去完成相应的异步调用逻辑,通过主线程和不同的业务子线程之间的执行流程,从而在启动独立的线程之后,主线程继续执行而不会产生停滞等待的情况。
java处理异步
1.常规的异步调用处理方式
1.在Java中,一般在处理类似的场景之时,都是基于创建独立的线程去完成相应的异步调用逻辑,通过主线程和不同的线程之间的执行流程,从而在启动独立的线程之后,主线程继续执行而不会产生停滞等待的情况。
2.通过消息队列中间件去做异步,比如RabbitMq,去解耦。
2.@Async介绍
在Spring中,基于@Async标注的方法,称之为异步方法;这些方法将在执行的时候,将会在独立的线程中被执行,调用者无需等待它的完成,即可继续其他的操作。
无返回值使用
下面展示一些 代码示例
/**
* 带参数的异步调用 异步方法可以传入参数
* 对于返回值是void,异常会被AsyncUncaughtExceptionHandler处理掉
* @param s
*/
@Async
public void asyncInvokeWithException(String s) {
log.info("asyncInvokeWithParameter, parementer={}", s);
throw new IllegalArgumentException(s);
}
有返回值使用
1.不考虑过期时间
/**
* // 失败回滚状态
* @param result
* @param id 单据主键id
* @return java.util.concurrent.Future<java.lang.Boolean>
*/
public void updateFailure(Future<Boolean> result, String id) {
try {
//设置了超时时间,若超时会抛出TimeoutException
if(!result.get()) {
// 失败回滚状态
......
......
log.info("失败状态回滚 id: {}", id);
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
2.处理返回值
- 普通处理
/**
* // 失败回滚状态
* @param result
* @param id 单据主键id
* @return java.util.concurrent.Future<java.lang.Boolean>
*/
public void updateFailure(Future<Boolean> result, String id) {
try {
//设置了超时时间,若超时会抛出TimeoutException
if(!result.get()) {
// 失败回滚状态
......
......
log.info("失败状态回滚 id: {}", id);
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
- 设置超时过期时间
/**
* // 失败回滚状态
* @param result
* @param id 单据主键id
* @return java.util.concurrent.Future<java.lang.Boolean>
*/
@Async
public void updateFailure(Future<Boolean> result, String id) {
try {
//设置了超时时间,若超时会抛出TimeoutException
if(!result.get(60, TimeUnit.SECONDS)) {
// 失败回滚状态
......
......
log.info("失败状态回滚 id: {}", id);
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
设置超时时间后,主线程里面也应该开启单独的线程来处理结果,不然要等待上一个任务执行完,时间可能过长。所以再结果处理方面上面再用@Async注解。
参考博客: Spring使用@Async注解.

本文介绍了同步和异步的概念,同步是顺序执行并等待所有结果,而异步则是发送调用指令后无需等待。在Java中,通常通过创建线程实现异步。此外,文章详细讲解了Spring框架中@Async注解的使用,包括无返回值和有返回值的情况,以及如何处理返回值和设置超时时间。

252

被折叠的 条评论
为什么被折叠?



