有时候,我们程序中需要执行一些对返回结果无影响的操作,或者耗时比较长的操作,如果这时我们直接将这些操作放在接口中执行,将会对返回结果的及时性产生较大的影响,或者我们有时需要过一定的时间间隔再执行这项任务,这时我们可以考虑在程序中专门运行几个线程去异步执行这些方法。
如果常用的,保存用户登录记录、用户登录、注册时进行的奖励操作(eg.加积分)、注册延迟多少秒发奖励、写金币积分的转移记录等
这种需求可能存在于每个业务接口,所以考虑将这个放到基类中。接口实现类只要继承这个基类就可以拥有这些方法:
private static ScheduledExecutorService executorService=Executors.newScheduledThreadPool(5, new ThreadFactory(){
private AtomicInteger ID=new AtomicInteger(0);
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setName("异步任务处理线程"+ID.addAndGet(1));
t.setDaemon(true);
return t;
}
});
/**
* 异步延迟执行任务
* @param task
* @param delay 延迟时间,单位:毫秒
*/
public static void asynExecTaskDelay(Runnable task,long delay){
executorService.schedule(task, delay, TimeUnit.MILLISECONDS);
}
/**
* 异步执行任务
* @param task
*/
public static void asynExecTask(Runnable task){
executorService.submit(task);
}
/**
* 异步记录用户的登录记录
* @param uld
*/
public void asynSaveLoginDetail(final UserLoginDetails uld){
asynExecTask(new Runnable(){
public void run() {
try {
DaoFactory.getInstance().getServer().save(uld);
if (uld.getUserId()!=null&&uld.getProductType()!=null)
CacheManager.getInstance().cacheString(KeyParam.USER_PRODUCT_TYPE, String.valueOf(uld.getUserId()), String.valueOf(uld.getProductType()));
} catch (Exception e) {
e.printStackTrace();
}
}
});
}