package com.golshadi.majid.core.mainWorker; import com.golshadi.majid.Utils.QueueObserver; import com.golshadi.majid.core.chunkWorker.Moderator; import com.golshadi.majid.database.ChunksDataSource; import com.golshadi.majid.database.TasksDataSource; import com.golshadi.majid.database.elements.Task; import com.golshadi.majid.report.listener.DownloadManagerListenerModerator; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Created by Majid Golshadi on 4/21/2014. */ public class QueueModerator implements QueueObserver { private final TasksDataSource tasksDataSource; private final ChunksDataSource chunksDataSource; private final Moderator moderator; private final DownloadManagerListenerModerator listener; private final List<Task> uncompletedTasks; private final int downloadTaskPerTime; private HashMap<Integer, Thread> downloaderList; private boolean pauseFlag = false; public QueueModerator(TasksDataSource tasksDataSource, ChunksDataSource chunksDataSource, Moderator localModerator, DownloadManagerListenerModerator downloadManagerListener, List<Task> tasks, int downloadPerTime){ this.tasksDataSource = tasksDataSource; this.chunksDataSource = chunksDataSource; this.moderator = localModerator; this.moderator.setQueueObserver(this); this.listener = downloadManagerListener; this.downloadTaskPerTime = downloadPerTime; this.uncompletedTasks = tasks; downloaderList = new HashMap<Integer, Thread>(downloadTaskPerTime); } public void startQueue() { if (uncompletedTasks != null) { int location = 0; while (uncompletedTasks.size() > 0 && !pauseFlag && downloadTaskPerTime >= downloaderList.size()) { Task task = uncompletedTasks.get(location); Thread downloader = new AsyncStartDownload(tasksDataSource, chunksDataSource, moderator, listener, task); downloaderList.put(task.id, downloader); uncompletedTasks.remove(location); downloader.start(); location++; } } } public void wakeUp(int taskID){ downloaderList.remove(taskID); startQueue(); } public void pause(){ pauseFlag = true; for (Map.Entry entry : downloaderList.entrySet()) { Integer id = (Integer) entry.getKey(); moderator.pause(id); } pauseFlag = false; } }