Javaスレッド通信-生産者/消費者モデル(セマフォ方式)

Javaスレッド通信-生産者/消費者モデル(セマフォ方式)

上記のブログは、キャッシュ領域使用してプロデューサーとコンシューマーを実現していますhttps://blog.csdn.net/qq_31142237/article/details/115285293

この記事では、ノンストップシナリオに応じてさまざまな方法を使用して、生産者/消費者モデルのセマフォ方法を紹介します。
セマフォメソッド:フラグを使用して、スレッドの待機とウェイクアップを制御します。セマフォと同様に、赤色のライトと緑色のライトで停止します。

例:
ドライバーの視点から:赤信号で停止し、立ち去ります。緑色のライトが消え、人々は止まります。
オブジェクト分析:車、人、
車の照明:車は歩くことです。
人々:ただ来て歩いてください。
信号灯信号が緑色のとき、車は歩いており、ライトが変化して人々に歩くように知らせます。人々はライトが赤いときに歩く、ライトを変えて車に歩くように言う

成し遂げる:

// 信号灯
    static class Signallamp{
    
    
        boolean flag = true; // 绿灯

        // 绿灯: 车走,人停
        public synchronized void CarGO(){
    
    
            // 不是绿灯,则停止等到人走
            if(!flag){
    
    
                try {
    
    
                    wait();
                } catch (InterruptedException e) {
    
    
                    e.printStackTrace();
                }
            }
            // 否则车走了,变成红灯,通只人行走
            System.out.println(Thread.currentThread().getName()+":现在是"+flag+"灯:车子行驶中");
            System.out.println("变灯了");
            flag = !flag;
            notify();
        }


        // 红灯: 车停了,人走
        public synchronized void ManGO(){
    
    
            // 绿灯,则车走(司机角度是绿灯,自己角度真实应该是红灯)
            if(flag){
    
    
                try {
    
    
                    wait();
                } catch (InterruptedException e) {
    
    
                    e.printStackTrace();
                }
            }
            // 否则人走了,变成绿灯,通知车走
            System.out.println(Thread.currentThread().getName()+":现在是"+flag+"灯:人在走路");
            System.out.println("变灯了");
            flag = !flag;
            notify();
        }
    }
   // 车
    static class Car implements  Runnable{
    
    
        Signallamp signallamp;
        public Car(Signallamp signallamp){
    
    
            this.signallamp = signallamp;
        }


        // 车在行走
        public void run() {
    
    
            for (int i = 0; i <20 ; i++) {
    
    
                signallamp.CarGO();
            }
        }
    }

  // 人
    static class Man implements  Runnable{
    
    
        Signallamp signallamp;
        public Man(Signallamp signallamp){
    
    
            this.signallamp = signallamp;
        }

        // 人在行走
        public void run() {
    
    
            for (int i = 0; i <20 ; i++) {
    
    
                signallamp.ManGO();
            }
        }
    }
   public static void main(String[] args) {
    
    
        Signallamp signallamp = new Signallamp();
        new Thread(new Car(signallamp)).start();
        new Thread(new Man(signallamp)).start();
    }

結果:
ここに画像の説明を挿入
完璧な終わり!

おすすめ

転載: blog.csdn.net/qq_31142237/article/details/115286177