ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码

Java多线程-生产者消费者几种实现方式(1/3)

来源:网络整理     时间:2016-06-02     关键词:Java多线程

本篇文章主要介绍了"Java多线程-生产者消费者几种实现方式",主要涉及到Java多线程方面的内容,对于Javajrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播感兴趣的同学可以参考一下: http://blog.csdn.net/monkey_d_meng/article/details/6251879wait()/notify()方法http:...

http://blog.csdn.net/monkey_d_meng/article/details/6251879

wait()/notify()方法

http://blog.csdn.net/ghsau/article/details/7433673

publicvoiddoWork(){
        new Thread(new Runnable() {
            @Overridepublicvoidrun() {
                Storage storage = new Storage();

                Producer p1 = new Producer(storage);
                p1.setNum(10);
                p1.setName("p1");

                Producer p2 = new Producer(storage);
                p2.setNum(10);
                p2.setName("p2");

                Consumer c1 = new Consumer(storage);
                c1.setNum(15);
                c1.setName("c1");

                Consumer c2 = new Consumer(storage);
                c2.setNum(15);
                c2.setName("c2");

                Consumer c3 = new Consumer(storage);
                c3.setNum(15);
                c3.setName("c3");

                Producer p3 = new Producer(storage);
                p3.setNum(10);
                p3.setName("p3");

                Producer p4 = new Producer(storage);
                p4.setNum(10);
                p4.setName("p4");

                Producer p5 = new Producer(storage);
                p5.setNum(10);
                p5.setName("p5");

                p1.start();
                p2.start();
                c1.start();
                c2.start();
                c3.start();
                p3.start();
                p4.start();
                p5.start();

            }
        }).start();
    }

    publicstaticclassStorage{privatestaticint MAX = 100;
        private ArrayList mObjectArrayList = new ArrayList<>(100);
        publicvoidproduce(int num){
            Log.e("Test",Thread.currentThread().getName()+", produce num = "+num);
            synchronized (mObjectArrayList){
                Log.e("Test",Thread.currentThread().getName()+", enter produce");
                while (mObjectArrayList.size()+num > MAX){
                    Log.e("Test",Thread.currentThread().getName()+", 需要生产 "+num+" 个, 目前有" +mObjectArrayList.size()+"个");
                    try {
                        mObjectArrayList.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                for(int i=1;i<=num;i++){
                    mObjectArrayList.add(new Object());
                }
                mObjectArrayList.notifyAll();
                Log.e("Test",Thread.currentThread().getName()+", 生产 "+num+" 个产品,目前总数"+mObjectArrayList.size());
            }
        }

        publicvoidconsume(int num){
            Log.e("Test",Thread.currentThread().getName()+", consume num = "+num);
            synchronized (mObjectArrayList){
                Log.e("Test",Thread.currentThread().getName()+", enter consume");
                while (mObjectArrayList.size()-num < 0){
                    Log.e("Test",Thread.currentThread().getName()+", 需要消费 "+num+" 个, 目前有" +mObjectArrayList.size()+"个");
                    try {
                        mObjectArrayList.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                int size = mObjectArrayList.size();
                for(int i=0;i0);
                }
                mObjectArrayList.notifyAll();
                Log.e("Test",Thread.currentThread().getName()+", 消费 "+num+" 个产品,目前总数"+mObjectArrayList.size());
            }
        }
    }

    publicstaticclassProducerextendsThread{private Storage mStorage;

        publicintgetNum() {
            return mNum;
        }

        publicvoidsetNum(int num) {
            mNum = num;
        }

        privateint mNum;
        publicProducer(Storage storage){
            mStorage = storage;
        }

        @Overridepublicvoidrun() {
            super.run();
            mStorage.produce(mNum);
        }
    }

    publicstaticclassConsumerextendsThread{private Storage mStorage;

        publicintgetNum() {
            return mNum;
        }

        publicvoidsetNum(int num) {
            mNum = num;
        }

        privateint mNum;
        publicConsumer(Storage storage){
            mStorage = storage;
        }

        @Overridepublicvoidrun() {
            super.run();
            mStorage.consume(mNum);
        }
    }

结果:

E/Test    (18509): p1, produce num = 10E/Test    (18509): p1, enter produce
E/Test    (18509): p1, 生产 10 个产品,目前总数10E/Test    (18509): p2, produce num = 10E/Test    (18509): p2, enter produce
E/Test    (18509): p2, 生产 10 个产品,目前总数20E/Test    (18509): c1, consume num = 15E/Test    (18509): c1, enter consume
E/Test    (18509): c1, 消费 15 个产品,目前总数5E/Test    (18509): c2, consume num = 15E/Test    (18509): c2, enter consume
E/Test    (18509): c2, 需要消费 15 个, 目前有5E/Test    (18509): c3, consume num = 15E/Test    (18509): c3, enter consume
E/Test    (18509): c3, 需要消费 15 个, 目前有5E/Test    (18509): p3, produce num = 10E/Test    (18509): p3, enter produce
E/Test    (18509): p3, 生产 10 个产品,目前总数15E/Test    (18509): c2, 消费 15 个产品,目前总数0E/Test    (18509): c3, 需要消费 15 个, 目前有0E/Test    (18509): p4, produce num = 10E/Test    (18509): p4, enter produce
E/Test    (18509): p4, 生产 10 个产品,目前总数10E/Test    (18509): p5, produce num = 10E/Test    (18509): c3, 需要消费 15 个, 目前有10E/Test    (18509): p5, enter produce
E/Test    (18509): p5, 生产 10 个产品,目前总数20E/Test    (18509): c3, 消费 15 个产品,目前总数5

await()/signal()方法

http://blog.csdn.net/ghsau/article/details/7481142
其他代码不用修改,只需要修改Storage类

publicstaticclass Storage{
        privatestaticint MAX = 100;
        private ArrayList mObjectArrayList = new ArrayList<>(100);
        final Lock lock = new ReentrantLock();//锁对象
        final Condition produce  = lock.newCondition();//写线程条件
        final Condition consume = lock.newCondition();//读线程条件publicvoidproduce(int num){
            Log.e("Test", Thread.currentThread().getName() + ", produce num = " + num);
            lock.lock();
            Log.e("Test", Thread.currentThread().getName() + ", enter produce");
            try{
                while (mObjectArrayList.size()+num > MAX){
                    Log.e("Test",Thread.currentThread().getName()+", 需要生产 "+num+" 个, 目前有" +mObjectArrayList.size()+"个");
                    produce.await();
                }
                for(int i=1;i<=num;i++){
                    mObjectArrayList.add(new Object());
                }
                consume.signalAll();
                Log.e("Test",Thread.currentThread().getName()+", 生产 "+num+" 个产品,目前总数"+mObjectArrayList.size());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        }

        publicvoidconsume(int num){
            Log.e("Test",Thread.currentThread().getName()+", consume num = "+num);
            lock.lock();
            Log.e("Test",Thread.currentThread().getName()+", enter consume");
            try{
                while (mObjectArrayList.size()-num < 0){
                    Log.e("Test",Thread.currentThread().getName()+", 需要消费 "+num+" 个, 目前有" +mObjectArrayList.size()+"个");
                    consume.await();
                }
                for(int i=0;i0);
                }
                produce.signalAll();
                Log.e("Test",Thread.currentThread().getName()+", 消费 "+num+" 个产品,目前总数"+mObjectArrayList.size());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        }
    }

结果:

相关图片

相关文章