经典线程同步问题(生产者&消费者)--Java实现

本文探讨了生产者-消费者问题这一经典的线程同步案例,通过设立多个具有固定容量的缓冲池来模拟真实场景,引入线程死锁的概念并提出解决方案。

======================================================
注:本文源代码点此下载
======================================================

原创作品,转载请注明出自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^)/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值