`
chong_zh
  • 浏览: 69997 次
  • 来自: 杭州
社区版块
存档分类
最新评论

Java的消费者-生产者模型实现总结

 
阅读更多
基于链表的生产者-消费者FIFO队列
queue是一个FIFO的链表队列,Producer负责生产QueueItem,一旦生产完成就添加到queue末尾。Consumer不停的consume queue中的QueueItem,若某一时刻consume完了就转入等待Producer生产新的QueueItem,一旦queue中出现新的未consume QueueItem则立即进行consume.

Consumer.run()
{
	while(true) 
	{
		synchronized(queueLock)//加锁monitor 
		{
			while(queue == null)
			{
				try 
				{
					queueLock.wait();//释放monitor并block,重新返回执行时将重新获得monitor
				}
				catch(InterruptedException e) {}
			}
			dat = queue.data;
			queue = queue.next;
		}
		...
		dat处理逻辑
		...
	}
}

Producer.produce(QueueItem item)
{			
	synchronized(queueLock) 
	{
	    if(queue == null)
	    	queue = item;    
	    else 
		{
	    	QueueItem cur = queue;
	        while(true) 
			{
				if(cur.next != null) cur = cur.next;
				else break;
	        }
	        cur.next = item;
	    }
	    queueLock.notifyAll();
	}		
}


给消费者线程增加停止开关
增加private开关字段:
private volatile boolean Consumer.stopped;


增加public的开关操纵方法:
public void killConsumer()
{
		stopped = true;
}

Consumer.run()
{
	while(!stopped) //改变Consumer线程循环条件
	{
		synchronized(queueLock) 
		{
			while(queue_item == null && !stopped)//在队列空时判断是否已经被杀
			{
				try 
				{
					queueLock.wait();
				}
				catch(InterruptedException e) {}
			}
			if(queue_item != null)
			{
				dat = queue.data;
				queue = queue.next;
			}
		}
		if(dat != null)
		{
			...
			dat处理逻辑
			...
		}
	}
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics