package com.xxx.betcart.server.service.impl.threadmanager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 线程基本类 * * 记录线程开始时间/结束时间/ 线程名称/线程属性参数 * @project commonsTiger * @author alanpeng * @date 2011-1-7 * Copyright (C) 2010-2012 www.2caipiao.com Inc. All rights reserved. */ public abstract class BaseThread implements Runnable { private transient final Logger logger = LoggerFactory.getLogger(BaseThread.class); private Long startTime;//开始时间 private String threadName;//线程名字 private Long endTime;//结束时间 private Long removeDelay = 0l;//线程结束后多久移除管理,单位秒 private volatile boolean isRun;//线程是否运行中 /** * 只定义线程名, * 线程状态数据执行完成removeDelay秒后删除 * @param threadName * @param removeDelay 小于等于0执行完后删除 */ public BaseThread(String threadName, Long removeDelay) { this.threadName = threadName; this.removeDelay = removeDelay; } @Override public void run() { try { startTime = System.currentTimeMillis(); excuteTask(); endTime = System.currentTimeMillis(); } catch (Exception e) { logger.error("开奖线程异常。"); logger.error(e.getMessage(),e); } finally { logger.info("开奖线程状态数据移除。"); ThreadManage.removeThreadData(threadName); } } public abstract void excuteTask(); public Long getStartTime() { return startTime; } public void setStartTime(Long startTime) { this.startTime = startTime; } public String getThreadName() { return threadName; } public void setThreadName(String threadName) { this.threadName = threadName; } public Long getEndTime() { return endTime; } public void setEndTime(Long endTime) { this.endTime = endTime; } public Long getRemoveDelay() { return removeDelay; } public void setRemoveDelay(Long removeDelay) { this.removeDelay = removeDelay; } public boolean isRun() { return isRun; } public void setRun(boolean isRun) { this.isRun = isRun; } }
package com.xxx.betcart.server.service.impl.threadmanager; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ScheduledThreadPoolExecutor; public class ThreadManage { public static ScheduledThreadPoolExecutor threadExec = new ScheduledThreadPoolExecutor(50); //key为唯一的标识 public static Map<String, BaseThread> map = new HashMap<String, BaseThread>(); /** * 执行线程,并把线程放入管理MAP中 * * @param thread * @create_time 2010-12-29 下午08:33:15 */ public static void excute(BaseThread thread) { map.put(thread.getThreadName(), thread); threadExec.execute(thread); } /** * 检查线程是否运行中 * @param threadName * @return T 是 F不是 * @create_time 2010-12-29 下午08:55:13 */ public static boolean isExcute(String threadName) { BaseThread thread = map.get(threadName); if (thread == null) { return false; } else { return true; } } /** * 删除线程数据 * @param threadName * @create_time 2010-12-29 下午09:46:48 */ public static void removeThreadData(String threadName) { map.remove(threadName); } /** * 遍历移除超时线程数据 * * @create_time 2010-12-29 下午09:58:15 */ public static void removeThreadDataTimeOut() { for (String name : map.keySet()) { BaseThread thread = map.get(name); if (thread.getEndTime() != null && thread.getRemoveDelay() > 0) { if (System.currentTimeMillis() > (thread.getEndTime() + thread.getRemoveDelay())) { removeThreadData(name); } } } } public static void main(String[] args) throws Exception { } }
package com.xxx.betcart.server.service.impl.threadmanager.thread; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.xxx.betcart.common.service.BetPlanPackageService; import com.xxx.betcart.server.service.impl.threadmanager.BaseThread; /** * 派奖线程 * * @project admin * @author alanpeng * @date 2011-6-2 * Copyright (C) 2010-2012 www.2caipiao.com Inc. All rights reserved. */ public class SychronizedPrizeThread extends BaseThread { private transient final Logger logger = LoggerFactory.getLogger(SychronizedPrizeThread.class); private long packageId; private BetPlanPackageService betPlanPackageService; public SychronizedPrizeThread(String threadName, long packageId, BetPlanPackageService betPlanPackageService) { super(threadName,0l); this.packageId = packageId; this.betPlanPackageService = betPlanPackageService; } public void excuteTask() { try { setRun(true); Thread.currentThread().setName(this.getThreadName()); betPlanPackageService.synchronousPrizeByPackageId(packageId); } catch (Exception e) { logger.error(e.getMessage(), e); } finally { setRun(false); } } }