package com.linkedin.camus.sweeper.utils; import java.util.Comparator; import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; import java.util.concurrent.PriorityBlockingQueue; import java.util.concurrent.RunnableFuture; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class PriorityExecutor extends ThreadPoolExecutor { public PriorityExecutor(int poolsize) { super(poolsize, poolsize, 60L, TimeUnit.SECONDS, new PriorityBlockingQueue<Runnable>(300, new PriorityTaskComparator())); } @Override protected <T> RunnableFuture<T> newTaskFor(final Callable<T> callable) { if (callable instanceof Important) return new PriorityTask<T>(((Important) callable).getPriority(), callable); else return new PriorityTask<T>(0, callable); } @Override protected <T> RunnableFuture<T> newTaskFor(final Runnable runnable, final T value) { if (runnable instanceof Important) return new PriorityTask<T>(((Important) runnable).getPriority(), runnable, value); else return new PriorityTask<T>(0, runnable, value); } public interface Important { int getPriority(); } private static final class PriorityTask<T> extends FutureTask<T> implements Comparable<PriorityTask<T>> { private final int priority; public PriorityTask(final int priority, final Callable<T> tCallable) { super(tCallable); this.priority = priority; } public PriorityTask(final int priority, final Runnable runnable, final T result) { super(runnable, result); this.priority = priority; } @Override public int compareTo(final PriorityTask<T> o) { final long diff = o.priority - priority; return 0 == diff ? 0 : 0 > diff ? -1 : 1; } } private static class PriorityTaskComparator implements Comparator<Runnable> { @Override public int compare(final Runnable left, final Runnable right) { return ((PriorityTask) left).compareTo((PriorityTask) right); } } }