多线程-线程间通信_生产者和消费者

package 多线程.线程间通信_生产者和消费者;

public class Phone {
    private String  type;
    private String  color;
    boolean f =true;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public Phone() {
    }

    /*
    * 生产
    * */
    public synchronized void addPhone(String type,String color) throws InterruptedException {
        while (!f){  //这里循环需要用while而不用if  避免多线程出错
            this.wait();
        }
        setType(type);
        setColor(color);

        f=false;
        this.notifyAll();
    }
    /*
    *
    * 获取
    * */
    public synchronized void getPhone() throws InterruptedException {
        while (f){
            this.wait();
        }
        System.out.println(getType()+"-----"+getColor());
        f=true;
        this.notify();

    }
}
package 多线程.线程间通信_生产者和消费者;
/*
* 生产者
* */
public class Producer implements Runnable {
    private Phone phone;

    public Producer(Phone phone) {
        this.phone = phone;
    }

    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            if (i % 2 == 0) {
                try {
                    phone.addPhone("洛基亚", "黑色");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            } else {
                try {
                    phone.addPhone("苹果", "金色");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        }
    }
}
package 多线程.线程间通信_生产者和消费者;
/*
* 消费者
*
* */
public class Consumer implements Runnable {
    private Phone phone;

    public Consumer(Phone phone) {
        this.phone = phone;
    }

    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            try {
                phone.getPhone();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
package 多线程.线程间通信_生产者和消费者;

public class demo01 {
    public static void main(String[] args) {
        Phone phone =new Phone();

        Producer producer =new Producer(phone);
        Thread t1 =new Thread(producer);
        t1.start();

        Consumer consumer =new Consumer(phone);
        Thread t2 =new Thread(consumer);
        t2.start();
    }
}

结果:

洛基亚-----黑色
苹果-----金色
洛基亚-----黑色
苹果-----金色
洛基亚-----黑色

 

猜你喜欢

转载自www.cnblogs.com/houtian2333/p/10702691.html