java asyncexec_Java8 基于spring @Async方法和Lambda实现任意代码块异步执行

使用jdk8有一段时间了,经常到stream和lambda操作集合,项目一般也都使用的是spring framework系列。借助lambda可以实现类似python闭包的写法,传递代码块给方法,异步方法加让lambda就可以实现任意代码块的异步执行。

首先定一个接口用来执行异步代码块

public interface AsyncService {

void asyncInvoke(AsyncExec consumer) throws WxErrorException;

@FunctionalInterface

interface AsyncExec {

void exec() throws WxErrorException;

}

}

给一个实现并交给spring容器管理

import me.chanjar.weixin.common.exception.WxErrorException;

@Service

public class AsyncServiceImpl implements AsyncService {

@Async

@Override

public void asyncInvoke(AsyncExec asyncExec) throws WxErrorException {

asyncExec.exec();

}

}

简单测试一下

@RunWith(SpringRunner.class)

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)

@ActiveProfiles("dev")

@Slf4j

public class AsyncServiceTest {

@Autowired

private AsyncService asyncService;

@Test

public void asyncServiceTest() throws WxErrorException, InterruptedException {

log.info("111111111111111");

asyncService.asyncInvoke(() -> {

try {

Thread.sleep(1000);

log.info("异步方法执行");

} catch (InterruptedException e) {

e.printStackTrace();

}

});

log.info("222222222222222");

Thread.sleep(2000);

}

}

测试结果

WechatIMG3470.png

结果显示测试成功了,从log的线程名看他们代码块中的是异步线程命,并没有安装代码顺序执行,11111111和22222222主线程执行完毕后,异步方法才执行。


版权声明:本文为weixin_42511080原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。