Springboot+多线程+等待获取执⾏结果
在⽇常的开发项⽬过程中,时常会有多线程的使⽤场景。最近开发的需求中也是如此,只不过这次需要开启多线程去执⾏,最后要等所有线程结束统⼀获取结果。所以在此整理⼀下
在springboot项⽬中开启异步线程需要满⾜⼀下⼏点
在启动类加⼊异步线程注解@EnableAsync
创建线程池并创建Bean实例
因为需要开启多线程异步执⾏并获取其返回结果,所以选⽤Future作为⽅法的返回值。
创建异步执⾏class,并在其中定义需要异步执⾏的⽅法,代码如下
/**
* @author Sean
* @version 1.0$
* @date 2020/7/2 20:11
* @description 任务执⾏类
*/
redis是nosql数据库吗@Slf4j
@Component
public class AsyncTaskService {
@Async
public Future<String> updateMenuRedis(String actorId) throws InterruptedException {
String msg = "500";
//按照⾃⼰实际所需的逻辑写⽅法代码即可,⼊参视实际情况⽽定
return new AsyncResult<String>(msg);
}
@Async
public Future<String> updateBaseActorRedis(String actorId) throws InterruptedException {
String msg = "500";
//按照⾃⼰实际所需的逻辑写⽅法代码即可,⼊参视实际情况⽽定
return new AsyncResult<String>(msg);
}
@Async
public Future<String> updateBaseResourcesRedis(String actorId) throws InterruptedException {
String msg = "500";
//按照⾃⼰实际所需的逻辑写⽅法代码即可,⼊参视实际情况⽽定
return new AsyncResult<String>(msg);
}
}
在需要进⾏异步线程⽅法执⾏的地⽅进⾏调⽤即可
@Override
public void updateRedis(String actorId) {
log.info("开始更新redis:{}",actorId);
try {
Future<String> menuRedisTask = asyncTaskService.updateMenuRedis(actorId);
Future<String> baseActorTask = asyncTaskService.updateBaseActorRedis(actorId);
Future<String> baseResourceTask = asyncTaskService.updateBaseResourcesRedis(actorId); Boolean result = false;
while (!result) {
Thread.sleep(1000);
if (menuRedisTask.isDone() && baseActorTask.isDone() && baseResourceTask.isDone()) { //通过Future的isDone⽅法来查询Future是否执⾏完毕
log.info("全部结束");
result = true;
break;
}
log.info("还未结束");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("更新缓存执⾏结束");
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论