最近在项目中遇到一个问题,需要在Controller接口中异步执行业务逻辑,以便于快速返回接口的信息
1、首先写个异步的线程池
import java.util.concurrent.*;
/**
* Created by connor on 2019/8/9.
*/
public class AsyncWorker {
private AsyncWorker() {
}
//30s开启时间
private static final int KEEP_ALIVE_TIME = 30;
private static final ThreadPoolExecutor worker = new ThreadPoolExecutor(0, Integer.MAX_VALUE, KEEP_ALIVE_TIME,
TimeUnit.SECONDS, new SynchronousQueue<Runnable>(), new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
throw new RejectedExecutionException(String.format(
"Thread pool is EXHAUSTED! Thread Name: %s, Pool Size: %d (active: %d, core: %d, max: %d, largest: %d), " +
"Queue: %d, Task: %d (completed: %d), Executor status:(isShutdown:%s, isTerminated:%s, isTerminating:%s)",
Thread.currentThread().getName(), e.getPoolSize(), e.getActiveCount(), e.getCorePoolSize(),
e.getMaximumPoolSize(), e.getLargestPoolSize(), e.getQueue().size(), e.getTaskCount(), e.getCompletedTaskCount(),
e.isShutdown(), e.isTerminated(), e.isTerminating()));
}
});
public static void execute(final Runnable runnable) {
worker.execute(runnable);
}
public static void shutdown() {
worker.shutdown();
}
}
2、在接口的Controller里面设置单句执行,jdk8的lamda表达式,单句执行即可。
AsyncWorker.execute(()->{
// 只需要在这里面写异步执行的逻辑即可
});
3、jdk8新特性——lambada表达式
(x,y) -> {}
左侧是一个小括号,里面是要实现的抽象方法的参数,有几个参数就写几个参数名,无参可写空括号,无需声明参数类型;
中间是一个jdk8新定义的箭头符号;
右侧是一个大括号,在括号内编写抽象方法的实现内容,有参时,可直接使用左侧括号中的对应参数,与正常方法的方法体相同;
使用方式:实现只有一个抽象方法的接口时会自行匹配到该方法,在箭头左侧编写对应参数个数的参数名,箭头右侧编写方法的实现代码(代码实现为单行时可去掉大括号{})