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

Posted houtian2333

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程-线程间通信_生产者和消费者相关的知识,希望对你有一定的参考价值。

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();
    }
}

结果:

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

 

 

以上是关于多线程-线程间通信_生产者和消费者的主要内容,如果未能解决你的问题,请参考以下文章

多线程-线程间通信-多生产者多消费者示例

生产者消费者中多线程安全问题(即线程间通信的安全问题)

java多线程同步以及线程间通信详解&消费者生产者模式&死锁&Thread.join()(多线程编程之二)

Java多线程的生产者与消费者模型,线程间的通信

JAVA-初步认识-第十四章-线程间通信-多生产者多消费者问题-JDK1.5解决办法

Java多线程编程核心技术多线程通信