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

[color=blue][size=xx-large]基于链表的生产者-消费者FIFO队列[/size][/color]
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();
}
}


[size=xx-large][color=blue]给消费者线程增加停止开关[/color][/size]
增加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处理逻辑
...
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值