All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.path.android.jobqueue.nonPersistentQueue.TimeAwarePriorityQueue Maven / Gradle / Ivy

package com.path.android.jobqueue.nonPersistentQueue;

import com.path.android.jobqueue.JobHolder;

import java.util.*;

/**
 * This is a {@link MergedQueue} class that can handle queue updates based on time.
 * It uses two queues, one for jobs that can run now and the other for jobs that should wait.
 * Upon retrieval, if it detects a job in delayed queue that can run now, it removes it from there, adds it to S0
 * and re-runs the operation. This is not very efficient but provides proper ordering for delayed jobs.
 */
public class TimeAwarePriorityQueue extends MergedQueue {

    /**
     * When retrieving jobs, considers current system nanotime to check if jobs are valid. if both jobs are valid
     * or both jobs are invalid, returns based on regular comparison
     * @param initialCapacity
     * @param comparator
     */
    public TimeAwarePriorityQueue(int initialCapacity, Comparator comparator) {
        super(initialCapacity, comparator, new TimeAwareComparator(comparator));
    }

    @Override
    protected SetId decideQueue(JobHolder jobHolder) {
        return jobHolder.getDelayUntilNs() <= System.nanoTime() ? SetId.S0 : SetId.S1;
    }

    /**
     * create a {@link PriorityQueue} with given comparator
     * @param setId
     * @param initialCapacity
     * @param comparator
     * @return
     */
    @Override
    protected JobSet createQueue(SetId setId, int initialCapacity, Comparator comparator) {
        if(setId == SetId.S0) {
            return new NonPersistentJobSet(comparator);
        } else {
            return new NonPersistentJobSet(new ConsistentTimedComparator(comparator));
        }
    }

    @Override
    public CountWithGroupIdsResult countReadyJobs(long now, Collection excludeGroups) {
        return super.countReadyJobs(SetId.S0, excludeGroups).mergeWith(super.countReadyJobs(SetId.S1, now, excludeGroups));
    }

    @Override
    public CountWithGroupIdsResult countReadyJobs(Collection excludeGroups) {
        throw new UnsupportedOperationException("cannot call time aware priority queue's count ready jobs w/o providing a time");
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy