多线程异步执行

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/curiouslearnerdhh/article/details/53674358

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

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


展开阅读全文

没有更多推荐了,返回首页