生产者与消费者 & wait()& notify()

package cn.test.thread;
/*
 * 线程的通讯:一个线程完成了自己的任务,要通知另外一个线程去完成另外一个任务
 * 
 * 生产者与消费者
 * 
 *问题一:出现了线程安全问题,价格错乱了
 *
 *问题二:生产者每生产完一个产品之后就要等待消费者去消费,然后再生产
 *
 *
 */
//产品类
class  Product{
    String name;//名字

    Double price;//价格

}
//生产者
class Producer extends Thread{

    Product p;//产品

    public Producer(Product p) {
        this.p  = p;
    }

//  public Producer(String name){
//      super(name);
//  }

    @Override
    public void run() {
        int i = 0;
        while(true){
            synchronized (p) {
                if(i%2==0){
                    p.name = "苹果";
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    p.price = 6.5;
                }else{
                    p.name = "香蕉";
                    p.price = 2.0;
                }
                System.out.println("生产者生产出了:"+p.name+"价格是:"+p.price);
                i++;

            }
        }

    }

}
//消费者
class Customer extends Thread{

    Product p;

    public Customer(Product p ){
        this.p = p;
    }

//  public Customer(String name){
//      super(name);
//  }

    @Override
    public void run() {
        while(true){
            synchronized (p) {

                System.out.println("消费者消费了:"+p.name+"价格:"+p.price);
            }
        }

    }


}
public class Demo5 {

    public static void main(String[] args) {

        Product p = new Product();//产品

        //创建生产者对象
        Producer producer = new Producer(p);
        //创建消费者
        Customer customer = new Customer(p);
        //调用start方法开启线程
        producer.start();
        customer.start();   
    }


}








package cn.test.thread;
/*
 * 线程的通讯:一个线程完成了自己的任务,要通知另外一个线程去完成另外一个任务
 * 
 * 生产者与消费者
 * 
 * wait():等待  如果线程执行了wait方法,那么该线程会进入等待状态,等待状态下的线程必须要被其他线程调用notify方法才能唤醒
 * notify():唤醒  唤醒等待线程
 * 
 * wiat与notify方法要主要的事项
 *  1.wait发放与notify方法是属于Object对象的
 *  2.wait发放与notify方法必须要在同步代码块或者同步函数中才能使用
 *  3.wait方法与notify方法必须要有由锁对象调用
 * 
 *问题一:出现了线程安全问题,价格错乱了
 *
 *问题二:生产者每生产完一个产品之后就要等待消费者去消费,然后再生产
 *
 *
 */
//产品类
class  Product{
    String name;//名字

    Double price;//价格

    boolean flag = false;//产品是否生产完毕的标识,默认情况是没有生产完成的
}
//生产者
class Producer extends Thread{

    Product p;//产品

    public Producer(Product p) {
        this.p  = p;
    }

//  public Producer(String name){
//      super(name);
//  }

    @Override
    public void run() {
        int i = 0;
        while(true){
            synchronized (p) {
                if(p.flag == false){

                    if(i%2==0){
                        p.name = "苹果";
                        p.price = 6.5;
                    }else{
                        p.name = "香蕉";
                        p.price = 2.0;
                    }
                    System.out.println("生产者生产出了:"+p.name+"价格是:"+p.price);
                    p.flag = true;
                    p.notify();//唤醒消费者去消费
                    i++;
                }else{

                    //已经生产完毕,等待消费者去消费
                    try {
                        p.wait();

                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }




            }
        }

    }

}
//消费者
class Customer extends Thread{

    Product p;

    public Customer(Product p ){
        this.p = p;
    }

//  public Customer(String name){
//      super(name);
//  }

    @Override
    public void run() {
        while(true){
            synchronized (p) {
                if(p.flag ){//产品已经生产完毕

                    System.out.println("消费者消费了:"+p.name+"价格:"+p.price);
                    p.flag = false;
                    p.notify();//唤醒生产者去生产
                }else{
                    //产品还没有生产,应该等待生产者先生产
                    try {
                        p.wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }

    }


}
public class Demo5 {

    public static void main(String[] args) {

        Product p = new Product();//产品

        //创建生产者对象
        Producer producer = new Producer(p);
        //创建消费者
        Customer customer = new Customer(p);
        //调用start方法开启线程
        producer.start();
        customer.start();   
    }


}








你可能感兴趣的:(java基础)