本文主要讲解生产环境中遇到的异步加载数据问题以及相应的解决思路。
系统登录的时候,需要根据用户ID生成一些和当前用户有关的数据放在缓存里,如果不考虑异步调用,则整个登录过程可能需要近8S的时间,这肯定是无法接受的。因而需要在登录的时候,将这些与登录无关的数据操作提取出来,并放在异步进程中实现。
在Java程序中,如果想实现异步调用方法的功能,需要通过线程方式实现,即实现java.lang.Runnable
接口或者继承java.lang.Thread
类,这里选择使用实现Runnable接口。考虑到是生产环境,还需要使用到ThreadPoolExecutor
线程池。下面直接看代码示例:
一、定义线程池实例服务
public class ThreadPoolManager {
public static ThreadPoolExecutor getInstance() {
if (executor == null) {
synchronized (ThreadPoolManager.class) {
if (executor == null) {
executor = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE_TIME,
TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10));
}
}
}
return executor;
}
}
二、任务处理实现
public class MyTask implements Runnable {
@Override
public void run() {
// 具体业务处理
......
}
}
三、放入线程池中执行
public void testExecutorPool() {
ThreadPoolExecutor executor = ThreadPoolManager.getInstance();
executor.execute(new Mytask());
}
PS: ThreadPoolExecutor+Runnable实现方式是无返回结果的,如果需要拿到返回结果要使用ThreadPoolExecutor+Callable方式。