マルチスレッド:ロックの妙用の消費者、生産者の運用

4309 ワード

このような需要があり、一つの生産機械がパンを生産するたびに、消費者の消費が終わってから生産を続けなければならない.
 
package com.ancely.fyw;

public class FoodDemo {

    private String mFoodName;//   
    private int mFoodId;//  ID
    private boolean isProducted;

    public synchronized void putFood(String foodName) {
        if (!isProducted) {
            //    
            mFoodId += 1;
            System.out.println(Thread.currentThread().getName() + "    :    : " + mFoodId);


            //      
            isProducted = true;
            
            notifyAll();//           synchronized      Exception in thread "Thread-1" java.lang.IllegalMonitorStateException


            try {
//wait         ,    synchronized            ,notify    .
                wait();//      ,           ,          ,    CPU         .
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public synchronized void outFood() {

        if (isProducted) {
            //       
            System.out.println(Thread.currentThread().getName() + " >>>>>>>>>>>>>   :    : " + mFoodId);
            isProducted = false;

            //    
            notifyAll();

            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static class ProductThread extends Thread {
        private FoodDemo mFoodDemo;

        public ProductThread(FoodDemo foodDemo) {
            mFoodDemo = foodDemo;
        }

        @Override
        public void run() {
            super.run();
            for (int i = 0; i < 20; i++) {
                mFoodDemo.putFood("   ");
            }
        }
    }

    public static class ConsumeThread extends Thread {
        private FoodDemo mFoodDemo;

        public ConsumeThread(FoodDemo foodDemo) {
            mFoodDemo = foodDemo;
        }

        @Override
        public void run() {
            super.run();
            for (int i = 0; i < 20; i++) {
                mFoodDemo.outFood();
            }
        }
    }

    public static void main(String[] args) {

        FoodDemo foodDemo = new FoodDemo();
        new ProductThread(foodDemo).start();
        new ConsumeThread(foodDemo).start();
    }
}

印刷結果は次のとおりです.
Thread-0    :    : 1
Thread-1 >>>>>>>>>>>>>   :    : 1
Thread-0    :    : 2
Thread-1 >>>>>>>>>>>>>   :    : 2
Thread-0    :    : 3
Thread-1 >>>>>>>>>>>>>   :    : 3
Thread-0    :    : 4
Thread-1 >>>>>>>>>>>>>   :    : 4
Thread-0    :    : 5
Thread-1 >>>>>>>>>>>>>   :    : 5
Thread-0    :    : 6
Thread-1 >>>>>>>>>>>>>   :    : 6
Thread-0    :    : 7
Thread-1 >>>>>>>>>>>>>   :    : 7
Thread-0    :    : 8
Thread-1 >>>>>>>>>>>>>   :    : 8
Thread-0    :    : 9
Thread-1 >>>>>>>>>>>>>   :    : 9
Thread-0    :    : 10
Thread-1 >>>>>>>>>>>>>   :    : 10
Thread-0    :    : 11
Thread-1 >>>>>>>>>>>>>   :    : 11
Thread-0    :    : 12
Thread-1 >>>>>>>>>>>>>   :    : 12
Thread-0    :    : 13
Thread-1 >>>>>>>>>>>>>   :    : 13
Thread-0    :    : 14
Thread-1 >>>>>>>>>>>>>   :    : 14
Thread-0    :    : 15
Thread-1 >>>>>>>>>>>>>   :    : 15
Thread-0    :    : 16
Thread-1 >>>>>>>>>>>>>   :    : 16
Thread-0    :    : 17
Thread-1 >>>>>>>>>>>>>   :    : 17
Thread-0    :    : 18
Thread-1 >>>>>>>>>>>>>   :    : 18
Thread-0    :    : 19
Thread-1 >>>>>>>>>>>>>   :    : 19
Thread-0    :    : 20
Thread-1 >>>>>>>>>>>>>   :    : 20