多线程异步执行

有时候,我们程序中需要执行一些对返回结果无影响的操作,或者耗时比较长的操作,如果这时我们直接将这些操作放在接口中执行,将会对返回结果的及时性产生较大的影响,或者我们有时需要过一定的时间间隔再执行这项任务,这时我们可以考虑在程序中专门运行几个线程去异步执行这些方法。

如果常用的,保存用户登录记录、用户登录、注册时进行的奖励操作(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();
			}
		}
	});
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值