浅谈浅谈Java中生产者与消费者问题的演变中生产者与消费者问题的演变
主要介绍了浅谈Java中生产者与消费者问题的演变,小编觉得挺不错的,现在分享给大家,也给大家做个参
考。一起跟随小编过来看看吧
想要了解更多关于Java生产者消费者问题的演变吗?那就看看这篇文章吧,我们分别用旧方法和新方法来处理这个问题。
生产者消费者问题是一个典型的多进程同步问题。
对于大多数人来说,这个问题可能是我们在学校,执行第一次并行算法所遇到的第一个同步问题。
虽然它很简单,但一直是并行计算中的最大挑战 - 多个进程共享一个资源。
问题陈述问题陈述
生产者和消费者两个程序,共享一个大小有限的公共缓冲区。
假设一个生产者“生产”一份数据并将其存储在缓冲区中,而一个消费者“消费”这份数据,并将这份数据从缓冲区中删除。
再假设现在这两个程序在并发地运行,我们需要确保当缓冲区的数据已满时,生产者不会放置新数据进来,也要确保当缓冲区
的数据为空时,消费者不会试图删除数据缓冲区的数据。
解决方案解决方案
为了解决上述的并发问题,生产者和消费者将不得不相互通信。
如果缓冲区已满,生产者将处于睡眠状态,直到有通知信息唤醒。
在消费者将一些数据从缓冲区删除后,消费者将通知生产者,随后生产者将重新开始填充数据到缓冲区中。
如果缓冲区内容为空的化,那么情况是一样的,只不过,消费者会先等待生产者的通知。
但如果这种沟通做得不恰当,在进程彼此等待的位置可能导致程序死锁。
经典的方法经典的方法
首先来看一个典型的Java方案来解决这个问题。
package ProducerConsumer;
import java.util.LinkedList;
import java.util.Queue;
public class ClassicProducerConsumerExample {
public static void main(String[] args) throws InterruptedException {
Buffer buffer = new Buffer(2);
Thread producerThread = new Thread(new Runnable() {
@Override
public void run() {
try {
buffer.produce();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread consumerThread = new Thread(new Runnable() {
@Override
public void run() {
try {
buffer.consume();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
producerThread.start();
consumerThread.start();
producerThread.join();
consumerThread.join();
}