一生产与一消费:操作栈实现
package com.cn.ee;
import java.util.ArrayList;
import java.util.List;
class W{
static List<String> list=new ArrayList<String>();
}
class PP{
synchronized public void shengchan(){
if(W.list.size()!=0){
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
W.list.add("aaaaa");
System.out.println("set list.size---->"+W.list.size());
this.notify();
}
synchronized public void xiaofei(){
if(W.list.size()==0){
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
String s=W.list.get(0);
W.list.remove(0);
System.out.println("get size()---->"+W.list.size());
this.notify();
}
}
class ThreadA extends Thread{
PP p;
public ThreadA(PP p) {
// TODO Auto-generated constructor stub
this.p=p;
}
public void run(){
while(true){
p.shengchan();
}
}
}
class ThreadB extends Thread{
PP p;
public ThreadB(PP p)
{
this.p=p;
}
public void run(){
while(true){
p.xiaofei();
}
}
}
public class aaa {
public static void main(String[] args) throws InterruptedException {
PP p=new PP();
ThreadA a=new ThreadA(p);
a.start();
ThreadB b1=new ThreadB(p);
b1.start();
}
}
一生产多消费:操作站
将最后面那个aaa函数改为如下:
public class aaa {
public static void main(String[] args) throws InterruptedException {
PP p=new PP();
ThreadA a=new ThreadA(p);
a.start();
ThreadB b1=new ThreadB(p);
ThreadB b2=new ThreadB(p);
ThreadB b3=new ThreadB(p);
ThreadB b4=new ThreadB(p);
ThreadB b5=new ThreadB(p);
b1.start();
b2.start();
b3.start();
b4.start();
b5.start();
}
}
会发生IndexOutOfBoundsExcepion异常,原因是,生产者进行生产之后,消费者进行消费,然后另外一个或多个消费者线程获得虚拟机,执行到wait方法,生产者进行生产,消费者进行消费,唤醒另外一个消费者线程,从一个空的list取出元素时发生异常。为了避免这种情况可以将PP类中的生产和消费方法中的if改成while就可以避免这种事情的发生。多生产一消费和多生产多消费同理。