Java多线程(九) 生产者/消费者模式实现

1. 一个生产者和一个消费者:操作值

1.1 公共值

public class ValueObject {
    public static String value = "";
}

1.2 生产者

public class Producer {
    private String lock;

    public Producer(String lock){
        super();
        this.lock = lock;
    }

    public void setValue(){
        try{
            synchronized (lock){
                //如果公共值还没有被消费,则当前线程等待
                if (!ValueObject.value.equalsIgnoreCase("")){
                    lock.wait();
                }else {
                    String value = System.currentTimeMillis() + "_" + System.nanoTime();
                    System.out.println("set value is " + value);
                    //生产者给公共值赋值
                    ValueObject.value = value;
                }
                //通知消费者可以消费了
                lock.notify();
            }
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}

注意:
执行到lock.wait()这句,wait()立即释放锁。

1.3 消费者

public class Consumer {
    private String lock;

    public Consumer(String lock){
        super();
        this.lock = lock;
    }

    public void getValue(){
        try{
            synchronized (lock){
                if (ValueObject.value.equals("")){
                    lock.wait();
                }
                System.out.println("get value is " + ValueObject.value);
                ValueObject.value = "";
                lock.notify();
            }
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}

1.4 生产者线程

public class ThreadP extends Thread {
    private Producer producer;

    public ThreadP(Producer producer){
        super();
        this.producer = producer;
    }

    @Override
    public void run(){
        while (true){
            producer.setValue();
        }
    }
}

1.5 消费者线程

public class ThreadC extends Thread {
    private Consumer consumer;

    public ThreadC(Consumer consumer){
        super();
        this.consumer = consumer;
    }

    @Override
    public void run(){
        while (true){
            consumer.getValue();
        }
    }
}

1.6 Test

public class Test {
    public static void main(String[] args) {
        String lock = new String("");

        Producer producer = new Producer(lock);
        ThreadP threadP = new ThreadP(producer);

        Consumer consumer = new Consumer(lock);
        ThreadC threadC = new ThreadC(consumer);

        threadP.start();
        threadC.start();
    }
}

1.7 运行结果

...
set value is 1541748157877_7058115684144
get value is 1541748157877_7058115684144
set value is 1541748157877_7058115845581
get value is 1541748157877_7058115845581
set value is 1541748157877_7058115937711
get value is 1541748157877_7058115937711
set value is 1541748157877_7058116052944
get value is 1541748157877_7058116052944
...

set和get是交替出现的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瑟 王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值