[color=blue][size=xx-large]基于链表的生产者-消费者FIFO队列[/size][/color]
queue是一个FIFO的链表队列,Producer负责生产QueueItem,一旦生产完成就添加到queue末尾。Consumer不停的consume queue中的QueueItem,若某一时刻consume完了就转入等待Producer生产新的QueueItem,一旦queue中出现新的未consume QueueItem则立即进行consume.
[size=xx-large][color=blue]给消费者线程增加停止开关[/color][/size]
增加private开关字段:
增加public的开关操纵方法:
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处理逻辑
...
}
}
}