Specify task order execution in Java Specify task order execution in Java multithreading multithreading

Specify task order execution in Java


You can use PriorityBlockingQueue to specify Queue to ThreadPoolExecutor.

public class PriorityExecutor extends ThreadPoolExecutor {    public PriorityExecutor(int corePoolSize, int maximumPoolSize,            long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);    }    //Utitlity method to create thread pool easily    public static ExecutorService newFixedThreadPool(int nThreads) {        return new PriorityExecutor(nThreads, nThreads, 0L,                TimeUnit.MILLISECONDS, new PriorityBlockingQueue<Runnable>());    }    //Submit with New comparable task     public Future<?> submit(Runnable task, int priority) {        return super.submit(new ComparableFutureTask(task, null, priority));    }    //execute with New comparable task     public void execute(Runnable command, int priority) {        super.execute(new ComparableFutureTask(command, null, priority));    }}

Define ComparableFutureTask to compare on Priority.

class ComparableFutureTask<T> extends FutureTask<T>        implements            Comparable<ComparableFutureTask<T>> {    volatile int priority = 0;    public ComparableFutureTask(Runnable runnable, T result, int priority) {        super(runnable, result);        this.priority = priority;    }    public ComparableFutureTask(Callable<T> callable, int priority) {        super(callable);        this.priority = priority;    }    @Override    public int compareTo(ComparableFutureTask<T> o) {        return Integer.valueOf(priority).compareTo(o.priority);    }  }


ThreadPoolExecutor constructor accepts BlockingQueue.You can pass queue as PriorityBlockingQueue. It does not make any grantee on ordering you need to pass custom comparators to maintain order.

static BlockingQueue<Task> queue=new PriorityBlockingQueue<Task>(MAXPOOL,new TaskComparator());static ThreadPoolExecutor threadpool = new ThreadPoolExecutor(30, MAXPOOL,         MAXPOOL, TimeUnit.SECONDS, (PriorityBlockingQueue) queue, new mThreadFactory());class TaskComparator implements Comparator<Task>{  public int compare(Task t1, Task t2){    //write you own logic to compare two task.  }}