package com.jackson.executor; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.util.Comparator; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.PriorityBlockingQueue; /** * Created by Jackson on 2016/10/26. */ @Deprecated public class PriorityTaskExecutor<T extends Runnable> { private Logger logger = LogManager.getLogger(getClass().getName()); private Thread queueThread;//用来获取队列任务的线程 private ExecutorService threadPool;//执行任务的线程池 private int maxThread;//默认最大执行线程数 private PriorityBlockingQueue<Runnable> taskQueue;//任务队列 /** * 添加任务 * @param task */ public void addTask(T task) { if(task==null)logger.error("task为Null"); taskQueue.put(task); } public <T extends Runnable>void addTasks(List<T> tasks) { for(T task:tasks){ taskQueue.put(task); } } /** * 创建对象 * @param <T> * @return */ public static <T extends Runnable> Builder builder() { return new Builder<T>(); } private PriorityTaskExecutor() {} private void init() { threadPool = Executors.newFixedThreadPool(maxThread); queueThread = new Thread() { @Override public void run() { while (!interrupted()) { Runnable task = take(); if (task != null) threadPool.execute(task); } } }; queueThread.setDaemon(true); queueThread.start(); } private Runnable take() { Thread.yield(); try { return taskQueue.take(); } catch (InterruptedException e) { e.printStackTrace(); } return null; } public static class Builder<T extends Runnable> { Builder() { super(); this.maxThread = 3; } private int maxThread ; private Comparator<T> comparator; public Builder setMaxThread(int maxThread) { this.maxThread = maxThread; return this; } public Builder setComparator(Comparator comparator) { this.comparator = comparator; return this; } public PriorityTaskExecutor<T> build() { PriorityTaskExecutor<T> executor = new PriorityTaskExecutor(); executor.maxThread = this.maxThread; executor.taskQueue = new PriorityBlockingQueue(11, comparator); executor.init(); return executor; } } }