Code example for ConcurrentHashMap

Methods: size, values

0
	 * 获取任务的总数量<br> 
	 * <b>任何状态的任务</b> 
	 * @return 
	 */ 
	public int getTaskCount(){ 
		return mTaskMap.size();
	} 
	 
	/** 
	 * 是否需要将task放入等等队列<br> 
	 * 主要是有很task在运行 
	 * @return 
	 */ 
	private boolean isNeedToWait(){ 
		if (mMaxRunning == 0 || getRunningTaskCount() < mMaxRunning){
			return false; 
		} 
		return true; 
	} 
	 
	/** 
	 * 将Task放入等待队列 
	 * @param task 
	 * @return 
	 */ 
	private boolean waitTask(Task task){
		return mWaitQueue.add(task);
	} 
	 
	/** 
	 * 从等待队列拿出一个task 
	 * @return 
	 */ 
	private Task notifyTask(){ 
		return mWaitQueue.poll();
	} 
	 
	private boolean cancelWaitTask(Task task){
		if (task == null){
			return false; 
		} 
		onCancelWaitTask(task);
		task.notifyStart();
		return mWaitQueue.remove(task);
	} 
	 
	/** 
	 * 当等待的Task被取消时执行 
	 * @param task 
	 */ 
	protected void onCancelWaitTask(Task task){
		 
	} 
	 
	/** 
	 * 启动一个等待的任务 
	 */ 
	public void startWaitTask(){ 
		if (!isNeedToWait()){ 
			Task task = notifyTask();
			if (task != null){
				startTask(task);
			} 
		} 
	} 
	 
	/** 
	 * 取消所有任务 
	 */ 
	public void cancelAllTask(){ 
		mWaitQueue.clear();
		Set<Entry<Long, Task>> taskSet = mTaskMap.entrySet();
		for (Entry<Long, Task> taskEntry : taskSet){
			Task task = taskEntry.getValue();
			cancelTask(task);
		} 
	} 
	 
	/** 
	 * 取消一个任务 
	 * @param taskId 
	 * @return 
	 */ 
	public boolean cancelTask(long taskId){
		Task task = getTask(taskId);
		return cancelTask(task);
	} 
	 
	/** 
	 * 取消一个任务 
	 * @param task 
	 * @return 
	 */ 
	protected boolean cancelTask(Task task){
		if (task != null){
			task.cancel();
			if (task.getStatus() == Task.STATE_WAIT){
				cancelWaitTask(task);
			} 
			return true; 
		} 
		return false; 
	} 
	 
	/** 
	 * 移除一个任务 
	 * @param taskId 
	 * @return 
	 */ 
	public boolean removeTask(long taskId){
		Task task = getTask(taskId);
		if (task != null){
			cancelTask(task);
			mTaskMap.remove(taskId);
			if (task.getStatus() == Task.STATE_COMPLETE){
				completedTaskRemoved(); 
			} 
			onTaskRemove(taskId);
			invokeDownloadRemove(taskId);
			return true; 
		} 
		return false; 
	} 
	 
	/** 
	 * 当TASK移除后 
	 * @param taskId 
	 */ 
	protected void onTaskRemove(long taskId) {
		 
	} 
	 
	/** 
	 * 获取一个任务 
	 * @param taskId 
	 * @return 
	 */ 
	public Task getTask(long taskId){
		return mTaskMap.get(taskId);
	} 
	 
	/** 
	 * 获取task的状态 
	 * @param taskId 
	 * @return 
	 */ 
	public int getTaskState(long taskId){
		Task task = getTask(taskId);
		if (task == null){
			return Task.STATE_INVALID;
		} 
		return task.getStatus();
	} 
	 
	/** 
	 * task是否是激活的, 即状态为 
	 * {@link Task#STATE_RUNNING}, {@link Task#STATE_PERPARE},  
	 * {@link Task#STATE_WAIT}, {@link Task#STATE_COMPLETE}。 
	 * 注意思,包括完成状态 
	 * @param taskId 
	 * @return 
	 */ 
	public boolean isTaskActive(long taskId){
		int status = getTaskState(taskId);
		if (status == Task.STATE_RUNNING ||
				status == Task.STATE_PERPARE ||
				status == Task.STATE_WAIT ||
				status == Task.STATE_COMPLETE){
			return true; 
		} 
		return false; 
	} 
	 
	/** 
	 * 获取的Task的列表 
	 * @return tasks的列表,如果没有task则返回null 
	 */ 
	public List<Task> getTasks(){
		int count = getTaskCount();
		if (count == 0) return null;
		 
		int size = count < 16 ? 16 : count;
		List<Task> tasks = new ArrayList<AbsDownloadManager.Task>(size);
		tasks.addAll(mTaskMap.values());
		return tasks;
	} 
	 
	private void invokeDownloadAdd(long id){
		if (mDownloadTaskListener != null){