package ALBasicServer.ALServerCmd; import java.util.ArrayList; import java.util.LinkedList; import java.util.concurrent.locks.ReentrantLock; import ALBasicServer.ALServerSynTask.ALSynTaskManager; /********************** * 命令行处理对象的注册处理函数 * * @author alzq.z * @email zhuangfan@vip.163.com * @time Oct 5, 2013 11:06:51 AM */ public class ALCmdDealerManager { private static ALCmdDealerManager _g_instance = new ALCmdDealerManager(); public static ALCmdDealerManager getInstance() { if(null == _g_instance) _g_instance = new ALCmdDealerManager(); return _g_instance; } /** 注册的命令行处理对象队列 */ private ArrayList<_IALBasicServerCmdDealer> _m_lCmdDealerList; /** 处理对象的队列锁 */ private ReentrantLock _m_dealerMutex; /** 已经输入的命令行数据存储 */ private LinkedList<String> _m_lCmdList; /** 处理内容队列锁 */ private ReentrantLock _m_cmdMutex; protected ALCmdDealerManager() { _m_lCmdDealerList = new ArrayList<_IALBasicServerCmdDealer>(); _m_dealerMutex = new ReentrantLock(); _m_lCmdList = new LinkedList<>(); _m_cmdMutex = new ReentrantLock(); } /**************** * 增加命令行对象 * * @author alzq.z * @time Oct 5, 2013 11:36:33 AM */ public void addCmd(String _cmd) { //添加到命令行队列中,并判断是否需要开启任务 _lockCmd(); boolean needStartTask = false; if(_m_lCmdList.isEmpty()) needStartTask = true; _m_lCmdList.add(_cmd); _unlockCmd(); //原队列为空则注册任务开启对应操作的执行 if(needStartTask) ALSynTaskManager.getInstance().regTask(new ALSynCmdDealTask()); } /****************** * 获取当前处理对象的队列 * * @author alzq.z * @time Oct 5, 2013 11:49:21 AM */ public ArrayList<_IALBasicServerCmdDealer> getDealerList() { _lockDealer(); ArrayList<_IALBasicServerCmdDealer> resList = _m_lCmdDealerList; _unlockDealer(); return resList; } /*************** * 注册命令处理对象队列 * * @author alzq.z * @time Oct 5, 2013 11:36:50 AM */ public void regDealer(_IALBasicServerCmdDealer _dealer) { _lockDealer(); ArrayList<_IALBasicServerCmdDealer> newCmdDealerList = new ArrayList<_IALBasicServerCmdDealer>(_m_lCmdDealerList.size() + 1); newCmdDealerList.addAll(_m_lCmdDealerList); newCmdDealerList.add(_dealer); //替换队列 _m_lCmdDealerList = newCmdDealerList; _unlockDealer(); } /*************** * 注销命令处理对象队列 * * @author alzq.z * @time Oct 5, 2013 11:36:50 AM */ public void unregDealer(_IALBasicServerCmdDealer _dealer) { _lockDealer(); ArrayList<_IALBasicServerCmdDealer> newCmdDealerList = new ArrayList<_IALBasicServerCmdDealer>(_m_lCmdDealerList.size()); newCmdDealerList.addAll(_m_lCmdDealerList); //移除处理对象 newCmdDealerList.remove(_dealer); //替换队列 _m_lCmdDealerList = newCmdDealerList; _unlockDealer(); } /**************** * 处理命令行操作对象 * * @author alzq.z * @time Oct 5, 2013 11:36:33 AM */ protected void _dealCmd() { String cmd = null; boolean needStartTask = false; //添加到命令行队列中,并判断是否需要开启任务 _lockCmd(); if(!_m_lCmdList.isEmpty()) { //取第一个命令行 cmd = _m_lCmdList.getFirst(); } _unlockCmd(); //获取处理队列 ArrayList<_IALBasicServerCmdDealer> dealerList = getDealerList(); if(null != cmd) { //非空才进行处理 for(int i = 0; i < dealerList.size(); i++) { _IALBasicServerCmdDealer dealer = dealerList.get(i); if(null == dealer) continue; try { dealer.dealCmd(cmd); } catch (Exception e) { e.printStackTrace(); } } } _lockCmd(); //取出第一个命令行 _m_lCmdList.pop(); //判断命令行是否为空 if(!_m_lCmdList.isEmpty()) needStartTask = true; _unlockCmd(); //原队列为空则注册任务开启对应操作的执行 if(needStartTask) ALSynTaskManager.getInstance().regTask(new ALSynCmdDealTask()); } protected void _lockCmd() { _m_cmdMutex.lock(); } protected void _unlockCmd() { _m_cmdMutex.unlock(); } protected void _lockDealer() { _m_dealerMutex.lock(); } protected void _unlockDealer() { _m_dealerMutex.unlock(); } }