生产者与消费者

/*
 * 生产者与消费者
 */
public class Test4 {
    public static void main(String[] args) {
        Clerk c = new Clerk();
        //生产者,使用匿名内部类
        new Thread(new Runnable() {

            @Override
            public void run() {
                synchronized(c) {    //    同步锁代码块
                    while(true) {    //无限循环表示无限生产
                        if(c.productNum == 0) {//商品产品数为零,开始生产
                            System.out.println("产品数为0,开始生产");
                            while(c.productNum < 4) {
                                c.productNum ++;
                                System.out.println("库存:" + c.productNum);
                            }
                            System.out.println("产品数为 :" + c.productNum + ", 结束生产");
                            
                            c.notify();//唤醒消费者
                        }else {    //有产品不生产
                            try {
                                c.wait();    //生产者线程等待
                            } catch (InterruptedException e) {
                                // TODO 自动生成的 catch 块
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
            
        }, "生产者").start();;
        
        new Thread(new Runnable() {

            @Override
            public void run() {
                synchronized(c) {    //    同步锁代码块
                    while(true) {    //无限循环表示无限消费次数
                        if(c.productNum == 4) {//商品产品数为满库存(4),开始消费
                            System.out.println("产品数为4,开始消费");
                            while(c.productNum > 0) {
                                c.productNum --;
                                System.out.println("库存:" + c.productNum);
                            }
                            System.out.println("产品数为 :" + c.productNum + ", 结束消费");
                            
                            c.notify();//唤醒生产者
                        }else {    
                            try {
                                c.wait();    //消费者线程等待
                            } catch (InterruptedException e) {
                                // TODO 自动生成的 catch 块
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
            
        }, "消费者").start();
        
        
    }
}

class Clerk{
    public static int productNum = 0;
}

  • wait():该方法用来将当前线程置入休眠状态,直到在其他线程调用此对象的notify()方法或notifyAll()方法将其唤醒。
  • 调用 notify() 方法解除阻塞的线程是从因调用该对象的 wait() 方法而阻塞的线程中随机选取的,我们无法预料哪一个线程将会被选择,所以编程时要特别小心,避免因这种不确定性而产生问题。
  • notifyAll() 也可起到和notify()类似作用,唯一的区别在于,调用 notifyAll() 方法将把因调用该对象的 wait() 方法而阻塞的所有线程一次性全部解除阻塞。
  • wait()和notify()必须成对出现。

 

posted @ 2020-10-08 15:46  Peterxiazhen  阅读(112)  评论(0编辑  收藏  举报