======================================================
注:本文源代码点此下载
======================================================
原创作品,转载请注明出自xelz's blog
博客地址:http://mingcn.cnblogs.com/
本文地址:http://mingcn.cnblogs.com/archive/2010/10/26/javathreadsync.html
生产者-消费者(producer-consumer)问题是一个著名的线程同步问题。它描述的是:有一群生产者线程在生产产品,并将这些产品提供给消费者线程去消费。
为使生产者与消费者之间能够并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池,生产者将它所生产的产品放入一个缓冲区中;消费者可以从一个缓冲区中取走产品产生消费。
尽管所有的生产者线程和消费者线程都是以异步方式运行的,但他们之间必须保持同步,即不允许消费者到一个空缓冲区去消费,也不允许生产者向一个已经被占用的缓冲区投放产品。
我把这个问题复杂化,设立m个缓冲池,每个缓冲池都有各自固定的容量,每个生产者或消费者在进行生产消费活动之前,先选择一个缓冲池。由此会引发一个线程死锁的问题:所有的生产者都在满的缓冲池等待,直到某个消费者取走一个产品,释放出一块缓冲区;同时所有的消费者都在空的缓冲池等待,直到某个生产者放进一个产品。
解决方法:记录每一个线程的等待状态,如果当前线程会产生等待,则检测是否会产生死锁(所有线程都在等待),如果会产生死锁,拒绝此次生产消费活动(换一个缓冲池)
java code:
public class producerandconsumer {//作者:xelz,博客http://www.cnblogs.com/mingcn
private static final int production_line_count = 20;//生产线(缓冲池)条数
private static final int production_line_size = 100;//生产线最大容量
private static final int producer_count = 50;//生产者个数
private static final int consumer_count = 50;//消费者个数
public static void main(string[] args) {
productionline[] productionline = new productionline[production_line_count];
producer[] producer = new producer[producer_count];
consumer[] consumer = new consumer[consumer_count];
synclock.initlock(producer_count, consumer_count);//初始化每个线程的等待状态
for(int i = 0; i
productionline[i] = new productionline((int) (math.random() * production_line_size) + 1, i);
}
for(int i = 0; i
producer[i] = new producer(i, productionline);
new thread(producer[i]).start();
}
for(int i = 0; i
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
本文探讨了生产者-消费者问题这一经典的线程同步案例,通过设立多个具有固定容量的缓冲池来模拟真实场景,引入线程死锁的概念并提出解决方案。

被折叠的 条评论
为什么被折叠?



