• java生产者/消费者模式实现——一生产者一消费者(操作值)


     胶多不粘话多不甜,直接上代码:

    生产者类:

    /**
     * Created by 51304 on 2016/2/28.
     */
    public class P {
        private String lock;
        public P(String lock){
            this.lock = lock;
        }
    
        public void setValue(){
            try{
                synchronized (this.lock){
                    if(!ValueObject.value.equals("")){
                        lock.wait();
                    }
                    String value = System.currentTimeMillis() + "_" +
                            System.nanoTime();
                    System.out.println("set value is " + value);
                    ValueObject.value = value;
                    lock.notify();
                }
            } catch (InterruptedException e){
                e.printStackTrace();
            }
        }
    }

    消费者类:

    import com.sun.org.apache.xpath.internal.SourceTree;
    
    /**
     * Created by 51304 on 2016/2/28.
     */
    public class C {
        private String lock;
        public C(String lock){
            this.lock = lock;
        }
    
        public void getValue(){
            try{
                synchronized (this.lock){
                    if(ValueObject.value.equals("")){
                        this.lock.wait();
                    }
                    System.out.println("get value is " + ValueObject.value);
                    ValueObject.value = "";
                    this.lock.notify();
                }
            } catch (InterruptedException e){
                e.printStackTrace();
            }
        }
    }

    存储值的对象:

    /**
     * Created by 51304 on 2016/2/28.
     */
    public class ValueObject {
        public static String value = "";
    }

    生产者线程:

    /**
     * Created by 51304 on 2016/2/28.
     */
    public class ThreadP extends Thread {
        private P p;
        public ThreadP(P p){
            this.p = p;
        }
    
        @Override
        public void run(){
            while (true){
                p.setValue();
            }
        }
    }

    消费者线程:

    /**
     * Created by 51304 on 2016/2/28.
     */
    public class ThreadC extends Thread {
        private C c;
        public ThreadC(C c){
            this.c = c;
        }
    
        @Override
        public void run(){
            while (true){
                c.getValue();
            }
        }
    }

    main方法:

    /**
     * Created by 51304 on 2016/2/28.
     */
    public class TestMain {
        public static void main(String[] args) {
            String lock = new String("");
            P p = new P(lock);
            C c = new C(lock);
    
            ThreadP threadP =new ThreadP(p);
            ThreadC threadC = new ThreadC(c);
    
            threadP.start();
            threadC.start();
        }
    }

    运行截图:

    思考:如果多生产者和多消费者程序能正常工作吗?

    答案是:程序会出现假死,也就是所有线程都停留在等待状态。出现这个现象的原因是,多生产者模式下notify()通知的线程还是生产者(选择通知那个线程时随机的,但只会通知一个),同理消费者也一样。当然解决的办法很明显使用notifyall().

  • 相关阅读:
    百度网盘免费下载加速
    linux docker 知识点总结
    openwrt 支持 EC200T
    openwrt 如何添加新设备支持
    openwrt DEPEND
    menuconfig kconfig
    golang 汇编
    按值传递
    YAPI认证用户利用Mock功能远程代码执行事件通告
    携程持久化KV存储实践
  • 原文地址:https://www.cnblogs.com/maxiaofang/p/5224262.html
Copyright © 2020-2023  润新知