黑马程序员技术交流社区

标题: 线程生产者消费者的问题? [打印本页]

作者: 442851994    时间: 2012-11-10 14:21
标题: 线程生产者消费者的问题?
本帖最后由 442851994 于 2012-11-14 21:53 编辑

为什么我在wait方法中加入时间后会连着出现两个生产,然后连着出现两个消费呢??下面是源代码:
public class Thread7 {
        public static void main(String[] args) {
                        Resourse r=new Resourse();
                        dust d=new dust(r);
                        consumer s=new consumer(r);
                        new Thread(d).start();
                        new Thread(s).start();
        }
}
//资源
class Resourse{
        private String name;
        boolean flag;
        private int count;
        public synchronized void set(String name){
                this.name=name+count;
                if(flag)
                        try {
                                this.wait(100000);
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                System.out.println(Thread.currentThread().getName()+"........生产者......"+this.name);
                count++;
                flag=true;
                this.notify();
        }
        public synchronized void get(){
                if(!flag)
                        try {
                                this.wait(100000);
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                        System.out.println(Thread.currentThread().getName()+".....消费者...."+this.name);
                        flag=false;
                        this.notify();
        }
}
//生产者
class dust implements Runnable{
        private Resourse r;
        dust(Resourse r){
                this.r=r;
        }
                public void run(){
                        while(true){
                        r.set("馒头");
                }
        }
}
//消费者
class consumer implements Runnable{
        private Resourse r;
        consumer(Resourse r){
                this.r=r;
        }
        public void run() {
                while(true){
                        r.get();
                }
        }
        
}


作者: 梁枝武    时间: 2012-11-10 15:39

  void wait()
           导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。
  void wait(long timeout)
           导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量。
  void wait(long timeout, int nanos)
           导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量。

在没添加时间条件时,线程必须等其他线程notify()或notifyAll()本线程才会被唤醒,否则继续等,加入时间后
该生产的线程就有了最大等待时间timeout,时间到wait就返回。这时候该线程如果这个时候获得了对象的锁,那么可以向下执行,即执行生产
该若生产线程在没等到最大等待时间timeout,消费线程已经退出并释放了锁,调用notify唤醒了生产线程,这时候也被唤醒了可以往下执行,进行生产

消费线程同理






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2