java在Controller部分业务异步执行以及jdk8的一些特性

2022-08-09 12:46:35

最近在项目中遇到一个问题,需要在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新定义的箭头符号;

右侧是一个大括号,在括号内编写抽象方法的实现内容,有参时,可直接使用左侧括号中的对应参数,与正常方法的方法体相同;

使用方式:实现只有一个抽象方法的接口时会自行匹配到该方法,在箭头左侧编写对应参数个数的参数名,箭头右侧编写方法的实现代码(代码实现为单行时可去掉大括号{})

  • 作者:零落尘土
  • 原文链接:https://blog.csdn.net/lijinqing39/article/details/103876207
    更新时间:2022-08-09 12:46:35