JobQueueFragment.java @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_jobqueue, container, false); } @Override public void onResume() { ctx = getActivity(); mainListView = getListView(); new JobQueue().execute(); super.onResume(); }
/** * Returns the estimated time in milliseconds before the next job is scheduled * to wake up. The result may be negative. Returns InternalJob.T_INFINITE if * there are no sleeping or waiting jobs. */ protected long sleepHint() { synchronized (lock) { //wait forever if job manager is suspended if (suspended) return InternalJob.T_INFINITE; if (!waiting.isEmpty()) return 0L; //return the anticipated time that the next sleeping job will wake InternalJob next = sleeping.peek(); if (next == null) return InternalJob.T_INFINITE; return next.getStartTime() - System.currentTimeMillis(); } }
/** * Returns a list of all jobs known to the job manager that belong to the given * family and are in one of the provided states. */ private List select(Object family, int stateMask) { List members = new ArrayList(); synchronized (lock) { if ((stateMask & Job.RUNNING) != 0) { for (Iterator it = running.iterator(); it.hasNext();) { select(members, family, (InternalJob) it.next(), stateMask); } } if ((stateMask & Job.WAITING) != 0) select(members, family, waiting.peek(), stateMask); if ((stateMask & Job.SLEEPING) != 0) select(members, family, sleeping.peek(), stateMask); } return members; }
@Override public boolean isIdle() { synchronized (lock) { return running.isEmpty() && waiting.isEmpty(); } }
/** * Changes a job priority. */ protected void setPriority(InternalJob job, int newPriority) { synchronized (lock) { int oldPriority = job.getPriority(); if (oldPriority == newPriority) return; job.internalSetPriority(newPriority); //if the job is waiting to run, re-shuffle the queue if (job.getState() == Job.WAITING) { long oldStart = job.getStartTime(); job.setStartTime(oldStart + (delayFor(newPriority) - delayFor(oldPriority))); waiting.resort(job); } } }
/** * Adds an item to the queue */ public void enqueue(InternalJob newEntry) { //assert new entry is does not already belong to some other data structure Assert.isTrue(newEntry.next() == null); Assert.isTrue(newEntry.previous() == null); InternalJob tail = dummy.next(); //overtake lower priority jobs. Only overtake conflicting jobs if allowed to while (canOvertake(newEntry, tail)) tail = tail.next(); //new entry is smaller than tail final InternalJob tailPrevious = tail.previous(); newEntry.setNext(tail); newEntry.setPrevious(tailPrevious); tailPrevious.setNext(newEntry); tail.setPrevious(newEntry); }
void enqueue(JobQueue queue, InternalJob job) { synchronized (lock) { queue.enqueue(job); } }
void dequeue(JobQueue queue, InternalJob job) { synchronized (lock) { queue.remove(job); } }
for (Iterator i = waitingThreadJobs.iterator(); i.hasNext();) { ThreadJob waitingJob = (ThreadJob) i.next(); if (runningJob.isConflicting(waitingJob) && waitingJob.shouldInterrupt())
/** * Returns a list of all jobs known to the job manager that belong to the given * family and are in one of the provided states. */ private List select(Object family, int stateMask) { List members = new ArrayList(); synchronized (lock) { if ((stateMask & Job.RUNNING) != 0) { for (Iterator it = running.iterator(); it.hasNext();) { select(members, family, (InternalJob) it.next(), stateMask); } } if ((stateMask & Job.WAITING) != 0) { select(members, family, waiting.peek(), stateMask); for (Iterator it = yielding.iterator(); it.hasNext();) { select(members, family, (InternalJob) it.next(), stateMask); } } if ((stateMask & Job.SLEEPING) != 0) select(members, family, sleeping.peek(), stateMask); } return members; }
@Override public boolean isIdle() { synchronized (lock) { return running.isEmpty() && waiting.isEmpty(); } }
/** * Changes a job priority. */ protected void setPriority(InternalJob job, int newPriority) { synchronized (lock) { int oldPriority = job.getPriority(); if (oldPriority == newPriority) return; job.internalSetPriority(newPriority); //if the job is waiting to run, re-shuffle the queue if (job.getState() == Job.WAITING) { long oldStart = job.getStartTime(); job.setStartTime(oldStart + (delayFor(newPriority) - delayFor(oldPriority))); waiting.resort(job); } } }
/** * Adds an item to the queue */ public void enqueue(InternalJob newEntry) { //assert new entry is does not already belong to some other data structure Assert.isTrue(newEntry.next() == null); Assert.isTrue(newEntry.previous() == null); InternalJob tail = dummy.next(); //overtake lower priority jobs. Only overtake conflicting jobs if allowed to while (canOvertake(newEntry, tail)) tail = tail.next(); //new entry is smaller than tail final InternalJob tailPrevious = tail.previous(); newEntry.setNext(tail); newEntry.setPrevious(tailPrevious); tailPrevious.setNext(newEntry); tail.setPrevious(newEntry); }
void enqueue(JobQueue queue, InternalJob job) { synchronized (lock) { queue.enqueue(job); } }
void dequeue(JobQueue queue, InternalJob job) { synchronized (lock) { queue.remove(job); } }
for (Iterator i = waitingThreadJobs.iterator(); i.hasNext();) { ThreadJob waitingJob = (ThreadJob) i.next(); if (runningJob.isConflicting(waitingJob) && waitingJob.shouldInterrupt())