package org.hy.common.thread;

import java.util.Hashtable;
import java.util.Map;

import org.hy.common.Help;





/**
 * 对线程池中的活动线程,分任务类型的统计其活动线程数
 *
 * @author   ZhengWei(HY)
 * @version  V1.0  2011-11-30
 */
public class TaskTypeTotal 
{
	/**
	 * 统计数据的保存对象
	 * 
	 * Map.Key   为任务类型
	 * Map.Value 为任务对象
	 */
	private Map<String ,TaskTypeTotalInfo>  totalMap;
	
	
	
	public TaskTypeTotal()
	{
		this.totalMap = new Hashtable<String ,TaskTypeTotalInfo>();
	}
	
	
	/**
	 * 获取任务类型的个数
	 * 
	 * @return
	 */
	public int getTaskTypeCount()
	{
		return this.totalMap.size();
	}
	
	
	/**
	 * 获取某一任务类型的活动线程数
	 * 
	 * @param i_TaskType
	 * @return
	 */
	public long getActiveCount(String i_TaskType)
	{
		if ( Help.isNull(i_TaskType) )
		{
			throw new NullPointerException("Task Type is null");
		}
		
		if ( this.totalMap.containsKey(i_TaskType) )
		{
			return this.totalMap.get(i_TaskType).getActiveCount();
		}
		else
		{
			return 0;
		}
	}
	
	
	/**
	 * 活动的任务类型数++
	 * 
	 * @param i_TaskType
	 */
	public void active(String i_TaskType)
	{
		if ( Help.isNull(i_TaskType) )
		{
			throw new NullPointerException("Task Type is null");
		}
		
		this.taskTypeTotalChange(i_TaskType, 1);
	}
	
	
	/**
	 * 活动的任务类型数--
	 * 
	 * @param i_TaskType
	 */
	public void rest(String i_TaskType)
	{
		if ( Help.isNull(i_TaskType) )
		{
			throw new NullPointerException("Task Type is null");
		}
		
		this.taskTypeTotalChange(i_TaskType, -1);
	}
	
	
	/**
	 *  统一用此方法设置统计数据
	 * 
	 * @param i_TaskType     任务类型
	 * @param i_OperateType  设置类型 >= 1 为:添加; 其它为减少
	 */
	private synchronized void taskTypeTotalChange(String i_TaskType ,int i_OperateType)
	{
		if ( i_OperateType >= 1 )
		{
			if ( this.totalMap.containsKey(i_TaskType) )
			{
				this.totalMap.get(i_TaskType).putActive();
			}
			else
			{
				this.totalMap.put(i_TaskType ,new TaskTypeTotalInfo(i_TaskType));
			}
		}
		else
		{
			this.totalMap.get(i_TaskType).outActive();
		}
	}
	
	
	
	/**
	 * 内部类。分任务类型的统计的元数据信息
	 */
	class TaskTypeTotalInfo
	{
		/** 任务类型 */
		private String taskType;
		
		/** 活动的线程数 */
		private long   activeCount;
		
		
		
		public TaskTypeTotalInfo(String i_TaskType)
		{
			this.taskType    = i_TaskType;
			this.activeCount = 1;
		}
		
		
		public String getTaskType()
		{
			return this.taskType;
		}
		
		
		public long getActiveCount()
		{
			return this.activeCount;
		}
		
		
		/**
		 * 活动数加1
		 */
		public void putActive()
		{
			this.setActiveCount(1);
		}
		
		
		/**
		 * 活动数减1
		 */
		public void outActive()
		{
			this.setActiveCount(-1);
		}
		
		
		/**
		 * 统一用此方法设置活动数
		 * 
		 * @param i_OperateType  设置类型 >= 1 为:添加; 其它为减少
		 */
		private synchronized void setActiveCount(long i_OperateType)
		{
			if ( i_OperateType >= 1 )
			{
				this.activeCount++;
			}
			else
			{
				this.activeCount--;
			}
		}
		
	}
	
}