多线程(5)生产者消费者模式
生产者消费者模式
生产者消费者问题(Producer-consumer problem),也称有限缓冲问题(Bounded-buffer problem),是一个多线程同步问题的经典案例。生产者生成一定量的数据放到缓冲区中,然后重复此过程;与此同时,消费者也在缓冲区消耗这些数据。生产者和消费者之间必须保持同步,要保证生产者不会在缓冲区满时放入数据,消费者也不会在缓冲区空时消耗数据。不够完善的解决方法容易出现死锁的情况,此时进程都在等待唤醒。
保证同一资源被多个线程并发访问时的完整性。常用的同步方法是采用信号或加锁机制,保证资源在任意时刻至多被一个线程访问。
wait() / notify()方法
当缓冲区已满时,生产者线程停止执行,放弃锁,使自己处于等待状态,让其他线程执行;
当缓冲区已空时,消费者线程停止执行,放弃锁,使自己处于等待状态,让其他线程执行。
当生产者向缓冲区放入一个产品时,向其他等待的线程发出可执行的通知,同时放弃锁,使自己处于等待状态;
当消费者从缓冲区取出一个产品时,向其他等待的线程发出可执行的通知,同时放弃锁,使自己处于等待状态。
public class consumerandprovider {
private String value;
public consumerandprovider(){
this.value="";
}
public void consumer() throws InterruptedException {
synchronized (this) {
while (value.equals("")) {
this.wait();
}
System.out.println("consumer-->" + value);
value = "";
this.notifyAll();
}
}
public void provider() throws InterruptedException {
synchronized (this){
while (!value.equals("")){
this.wait();
}
value="111111111";
System.out.println("provider-->" + value);
this.notifyAll();
}
}
}
class provider extends Thread{
private consumerandprovider com;
public provider(consumerandprovider com){
this.com=com;
}
@Override
public void run(){
try {
while (true){
com.provider();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class consumer extends Thread{
private consumerandprovider com;
public consumer(consumerandprovider com){
this.com=com;
}
@Override
public void run(){
try {
while (true){
com.consumer();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
3万+

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



