package com.dl7.downloaderlib.service; import java.util.HashMap; import java.util.Map; import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; /** * Created by long on 2016/5/26. * 下载线程池 */ public class DownloadThreadPool { private final static int MAX_DOWNLOAD_THREAD = 5; private Map<String, DownloadTask> mRunnableHolder = new HashMap<>(); // 下载线程池 private final ThreadPoolExecutor mRunnablePool = (ThreadPoolExecutor) Executors.newFixedThreadPool(MAX_DOWNLOAD_THREAD); // 更新数据库线程池 private final ThreadPoolExecutor mDbPool = (ThreadPoolExecutor) Executors.newFixedThreadPool(MAX_DOWNLOAD_THREAD); private DownloadThreadPool() {} private static class HolderClass { private static final DownloadThreadPool instance = new DownloadThreadPool(); } public static DownloadThreadPool getInstance() { return HolderClass.instance; } /** * 执行线程 * @param task 线程 */ public void execute(DownloadTask task) { if (task.isRunning()) { return; } cancel(task); synchronized (this) { mRunnableHolder.put(task.tag(), task); } mRunnablePool.execute(task); } /** * 取消线程 * @param url 线程url * @param isDel 是否删除任务 */ public void cancel(String url, boolean isDel) { synchronized (this) { if (mRunnableHolder.containsKey(url)) { DownloadTask runnable = mRunnableHolder.get(url); mRunnablePool.remove(runnable); if (runnable != null) { if (isDel) { runnable.cancel(); } else { runnable.stop(); } } mRunnableHolder.remove(url); } } } public void cancel(DownloadTask task) { cancel(task.tag(), false); } /** * 取消所有线程 */ public void cancelAll() { synchronized (this) { for (DownloadTask task : mRunnableHolder.values()) { mRunnablePool.remove(task); if (task != null) { task.cancel(); } } mRunnableHolder.clear(); } } /** * 获取Runnable * @param url url * @return */ public DownloadTask getRunnable(String url) { if (mRunnableHolder.containsKey(url)) { return mRunnableHolder.get(url); } return null; } /** * 更新数据库 * @param runnable */ public void update(Runnable runnable) { mDbPool.execute(runnable); } }