package com.hqyg.disjob.quence; import java.util.LinkedList; import java.util.Queue; import java.util.concurrent.locks.ReentrantLock; /** * 说明:这里的队列是严格的无阻塞队列。如果这个队列中某个业务室阻塞式的,那么将会导致一个严重的问题就是后面的action 就无法保证顺利执行。 * 使用场景:无阻塞是行为队列 * @author Disjob * */ public class BaseActionQueue implements ActionQueue { private Queue<Action> queue; private Executor executor; private ReentrantLock lock = new ReentrantLock(); public BaseActionQueue(Executor executor) { this.executor = executor; queue = new LinkedList<Action>(); } public BaseActionQueue(Executor executor, Queue<Action> queue) { this.executor = executor; this.queue = queue; } public ActionQueue getActionQueue() { return this; } public Queue<Action> getQueue() { return queue; } public void enqueue(Action action) { int queueSize = 0; if(action.getActionQueue() == null){ action.setActionQueue(this); } lock.lock(); try{ queue.add(action); queueSize = queue.size(); }finally{ lock.unlock(); } if (queueSize == 1) { executor.execute(action); } if (queueSize > 4 * Runtime.getRuntime().availableProcessors()) { Log.warn(action.toString() + " queue size : " + queueSize); } } public void dequeue(Action action) { Action nextAction = null; int queueSize = 0; String tmpString = null; lock.lock(); try{ queueSize = queue.size(); Action temp = queue.remove(); if (temp != action) { tmpString = temp.toString(); } if (queueSize != 0) { nextAction = queue.peek(); } }finally{ lock.unlock(); } if (nextAction != null) { executor.execute(nextAction); } if (queueSize == 0) { Log.debug("queue.size() is 0."); } if (tmpString != null) { Log.debug("action queue error. temp " + tmpString + ", action : " + action.toString()); } } public void clear() { lock.lock(); try{ queue.clear(); }finally{ lock.unlock(); } } }