package com.zhan_dui.download.alfred; import com.zhan_dui.download.alfred.missions.Mission; import java.util.HashMap; import java.util.Map; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** * Created by daimajia on 14-1-30. */ public class Alfred { private final String TAG = "Alfred"; private static int MAX_MISSION_COUNT = 5; private static Alfred Instance; protected ThreadPoolExecutor mExecutorService; protected HashMap<Integer,Mission> mMissionBook; public static synchronized Alfred getInstance(){ if(Instance == null || Instance.mExecutorService.isShutdown()){ Instance = new Alfred(); } return Instance; } private Alfred(){ mMissionBook = new HashMap<Integer, Mission>(); mExecutorService = new AlfredMissionPool(MAX_MISSION_COUNT,MAX_MISSION_COUNT,15,TimeUnit.SECONDS,new LinkedBlockingDeque<Runnable>()); } public void addMission(Mission mission){ mMissionBook.put(mission.getMissionID(), mission); mExecutorService.execute(mission); } public void pauseMission(int missionID){ if(mMissionBook.containsKey(missionID)){ mMissionBook.get(missionID).pause(); } } public void resumeMission(int missionID){ if(mMissionBook.containsKey(missionID)){ mMissionBook.get(missionID).resume(); } } public void cancelMission(int missionID){ if(mMissionBook.containsKey(missionID)){ mMissionBook.get(missionID).cancel(); } } public void surrenderMissions(){ for(Map.Entry mission : mMissionBook.entrySet()){ mMissionBook.get(mission).cancel(); } } public static void setMaxMissionCount(int count){ if(Instance == null && count > 0) MAX_MISSION_COUNT = count; else throw new IllegalStateException("Can not change max mission count after getInstance been called"); } private class AlfredMissionPool extends ThreadPoolExecutor { private AlfredMissionPool(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); } @Override protected void afterExecute(Runnable r, Throwable t) { super.afterExecute(r, t); } } }