当前位置: 代码迷 >> 多核软件开发 >> 关于线程死锁有关问题 wait notifyAll
  详细解决方案

关于线程死锁有关问题 wait notifyAll

热度:6212   发布时间:2013-02-26 00:00:00.0
请教大家关于线程死锁问题 wait notifyAll - Java / Java SE
Java code
public class ProducerConsumer{    public static void main(String[] args){        SyncStack ss = new SyncStack();        Producer p = new Producer(ss);        Producer pp = new Producer(ss);        Consumer c = new Consumer(ss);        new Thread(pp).start();        new Thread(p).start();        new Thread(c).start();    }}class WoTou{    int id;    WoTou(int id){        this.id=id;    }    public String toString(){        return "WoTou:"+id;    }}class SyncStack{    int index = 0;    WoTou[] arrwt=new WoTou[6];        public synchronized void push(WoTou wt){        while(index==arrwt.length){            try{                this.wait();            }catch(InterruptedException e){                System.out.println(e);            }        }        this.notifyAll();        arrwt[index]=wt;        index++;            }    public synchronized WoTou pop(){        while(index==0){            try{                this.wait();            }catch(InterruptedException e){                System.out.println(e);            }        }        this.notifyAll();        index--;        return arrwt[index];    }}class Producer implements Runnable{    SyncStack ss=null;    Producer(SyncStack ss){        this.ss=ss;    }    public void run(){        for(int i=0;i<10;i++){            WoTou wt = new WoTou(i);            ss.push(wt);            System.out.println("生产:"+wt);            try {                Thread.sleep((int)(Math.random() * 200));            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }}class Consumer implements Runnable{    SyncStack ss = null;    Consumer(SyncStack ss){        this.ss=ss;    }    public void run(){        for(int i=0;i<10;i++){            WoTou wt=ss.pop();            System.out.println("消费:"+wt);            try {                Thread.sleep((int)(Math.random() * 200));            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }}

当SyncStack类里的WoTou[] arrwt=new WoTou[6] 元素小于10就会死锁,好想是一直被 wait 着。
为什么notifyAll不会唤醒pop()方法。
是哪里的原因,始终找不到。这是尚学堂视频里的例子。比对后也找不到,不明白。
请大家帮忙找找原因。

------解决方案--------------------------------------------------------
LZ搞两个线程去放东西,一个线程去读,读10次完,消费者线程结束了,ss又是满的,于是生产者就在那等呀等。再取比对看看吧
------解决方案--------------------------------------------------------
两个生产线程一个消费线程,也就是说会生产20次,消费10次,当消费线程结束后就不会触发pop,所有生产线成满的时候就会一直停留在wait
  相关解决方案