package ALBasicServer.ALSocket;
import java.util.LinkedList;
import java.util.concurrent.Semaphore;
import java.util.concurrent.locks.ReentrantLock;
/*********************
* 存储所有需要发送消息的Socket,并使用堆栈方式进行管理。<br>
* 逐个取出并进行发送处理
*
* @author alzq.z
* @email zhuangfan@vip.163.com
* @time Feb 19, 2013 1:42:56 PM
*/
public class ALServerSendSocketMgr
{
private static ALServerSendSocketMgr g_instance = new ALServerSendSocketMgr();
public static ALServerSendSocketMgr getInstance()
{
if(null == g_instance)
g_instance = new ALServerSendSocketMgr();
return g_instance;
}
/** 存储Socket数量相关的信号量 */
private Semaphore _m_sSocketEvent;
/** 发送端口队列锁 */
private ReentrantLock _m_rSocketLock;
/** 需要发送的SocketList队列 */
private LinkedList<ALBasicServerSocket> _m_lSendSocketList;
protected ALServerSendSocketMgr()
{
_m_sSocketEvent = new Semaphore(0);
_m_rSocketLock = new ReentrantLock();
_m_lSendSocketList = new LinkedList<ALBasicServerSocket>();
}
/*****************
* 添加需要发送的Socket对象
*
* @author alzq.z
* @time Feb 19, 2013 1:44:32 PM
*/
public void addSendSocket(ALBasicServerSocket _socket)
{
_lock();
_m_lSendSocketList.add(_socket);
_m_sSocketEvent.release();
_unlock();
}
/*****************
* 取出第一个需要发送数据的Socket
*
* @author alzq.z
* @time Feb 19, 2013 1:44:54 PM
*/
public ALBasicServerSocket popSendSocket()
{
_m_sSocketEvent.acquireUninterruptibly();
ALBasicServerSocket socket = null;
_lock();
socket = _m_lSendSocketList.pop();
_unlock();
return socket;
}
//================= protected function
protected void _lock()
{
_m_rSocketLock.lock();
}
protected void _unlock()
{
_m_rSocketLock.unlock();
}
}