经典线程同步问题(生产者&消费者)
2012-03-29 15:50
211 查看
生产者-消费者(producer-consumer)问题是一个著名的线程同步问题。它描述的是:有一群生产者线程在生产产品,并将这些产品提供给消费者线程去消费。
为使生产者与消费者之间能够并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池,生产者将它所生产的产品放入一个缓冲区中;消费者可以从一个缓冲区中取走产品产生消费。
尽管所有的生产者线程和消费者线程都是以异步方式运行的,但他们之间必须保持同步,即不允许消费者到一个空缓冲区去消费,也不允许生产者向一个已经被占用的缓冲区投放产品。
我把这个问题复杂化,设立m个缓冲池,每个缓冲池都有各自固定的容量,每个生产者或消费者在进行生产消费活动之前,先选择一个缓冲池。由此会引发一个线程死锁的问题:所有的生产者都在满的缓冲池等待,直到某个消费者取走一个产品,释放出一块缓冲区;同时所有的消费者都在空的缓冲池等待,直到某个生产者放进一个产品。
解决方法:记录每一个线程的等待状态,如果当前线程会产生等待,则检测是否会产生死锁(所有线程都在等待),如果会产生死锁,拒绝此次生产消费活动(换一个缓冲池)
Java Code:
?
为使生产者与消费者之间能够并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池,生产者将它所生产的产品放入一个缓冲区中;消费者可以从一个缓冲区中取走产品产生消费。
尽管所有的生产者线程和消费者线程都是以异步方式运行的,但他们之间必须保持同步,即不允许消费者到一个空缓冲区去消费,也不允许生产者向一个已经被占用的缓冲区投放产品。
我把这个问题复杂化,设立m个缓冲池,每个缓冲池都有各自固定的容量,每个生产者或消费者在进行生产消费活动之前,先选择一个缓冲池。由此会引发一个线程死锁的问题:所有的生产者都在满的缓冲池等待,直到某个消费者取走一个产品,释放出一块缓冲区;同时所有的消费者都在空的缓冲池等待,直到某个生产者放进一个产品。
解决方法:记录每一个线程的等待状态,如果当前线程会产生等待,则检测是否会产生死锁(所有线程都在等待),如果会产生死锁,拒绝此次生产消费活动(换一个缓冲池)
Java Code:
?
相关文章推荐
- 经典线程同步问题(生产者&消费者)--Java实现
- 经典线程同步问题(生产者&消费者)--Java实现
- 经典线程同步问题(生产者&消费者)--Java实现
- 线程同步经典问题——生产者消费者问题
- 操作系统的一个经典问题 -- "生产者-消费者"问题
- [Java] Thread-05- 线程同步-生产者与消费者的经典问题
- [Java] Thread-05- 线程同步-生产者与消费者的经典问题
- Java经典线程同步问题------生产者与消费者
- Java经典线程同步问题------生产者与消费者
- Java经典线程同步问题------生产者与消费者
- 经典多线程实例:生产者消费者问题
- 【操作系统】经典教程同步问题 ---- 生产者和消费者
- 黑马程序员——多线程操作经典实例:生产者消费者问题
- 线程同步2 ------ 用条件变量来解决生产者消费者问题
- java多线程之生产者消费者经典问题
- 经典进程问题:生产者与消费者
- Linux 系统应用编程——多线程经典问题(生产者-消费者)
- java多线程经典的生产者消费者问题
- java多线程总结六:经典生产者消费者问题实现
- ruby线程实现生产者消费者问题示例(队列Queue实现线程同步)