前言
数据库信息查询是大家最经常见到的工作问题。一般是单线程顺序查询,这样查询总时间是所有查询时间之和,消耗时间较长。如果采用多线程并行查询,则时间变成单个功能查询时间最长的。时间大大缩短。依据阿里开发规范,要重写ThreadPoolExecutor线程池,提高可控性。数据库查询还需要活动线程执行完的返回值,这样就不但要重写ThreadPoolExecutor,还得重写CallAble还获得返回值(RunAble不支持获得返回值)。下面给大家介绍一种优雅简洁实现上面功能的例子。
场景:实现多线程并发并获得返回值
代码:
因为大家contorller和dao层都很熟悉了,我这也不涉及他们的改变,就先省略。直接写需要改变的serviceImpl。
serviceImpl层:
package com.asiainfo.cem.uaa.service;
import com.asiainfo.cem.common.util.ParallelUtil;
import com.asiainfo.cem.common.util.ParallelUtil.ParallelJob;
import com.asiainfo.cem.uaa.common.UaaConstants;
import com.asiainfo.cem.uaa.domain.LoginUserDTO;
import com.asiainfo.cem.uaa.domain.SysUser;
import com.asiainfo.cem.uaa.dao.SysPermissionDao;
import com.asiainfo.cem.uaa.dao.SysRoleDao;
import com.asiainfo.cem.uaa.dao.SysUserDao;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
/**
*@program: cem
*@description:
*@author: houzf
*/
@Service
public class UserServiceDetail implements UserDetailsService {
@Autowired
private SysUserDao sysUserDao;
@Autowired
private SysRoleDao sysRoleDao;
@Autowired
private SysPermissionDao sysPermissionDao;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
SysUser userDO = sysUserDao.findByUsername(username);
if (userDO == null) {
throw new UsernameNotFoundException(MessageFormat.format("{0} is empty.", username));
}
P