package threads;
/*
三个不同的线程将会共用一个 Foo 实例。

线程 A 将会调用 one() 方法
线程 B 将会调用 two() 方法
线程 C 将会调用 three() 方法
请设计修改程序，以确保 two() 方法在 one() 方法之后被执行，three() 方法在 two() 方法之后被执行。


示例 2:
输入: [1,3,2]
输出: "onetwothree"
解释:
输入 [1,3,2] 表示线程 A 将会调用 one() 方法，线程 B 将会调用 three() 方法，线程 C 将会调用 two() 方法。
正确的输出是 "onetwothree"。

链接：https://leetcode-cn.com/problems/print-in-order
 */


import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Semaphore;

class Foo2 {
    private Semaphore s12 = new Semaphore(1);
    private Semaphore s23 = new Semaphore(0);

    void one() {
        System.out.println("A: " + s12.availablePermits());
        s12.release();
        System.out.println("" + s12.availablePermits());
    }

    void two() {
        try {
            s12.acquire();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("B");
        s23.release();
    }

    void three() {
        try {
            s23.acquire();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("C");
    }
}

public class PrintInOrder2 {
    public static void main(String[] args) throws Exception {
        Foo2 foo = new Foo2();
        Thread a = new Thread(foo::one);
        Thread b = new Thread(foo::two);
        Thread c = new Thread(foo::three);

        c.start();
        b.start();
        a.start();
    } // 一般情况下, 因为多线程所以不保证输出一定按start()的线程的顺序, 即上面代码不一定是: "threetwoone"
}
@@ -385,76 +385,67 @@
 ent.
-CountDownLatch;%0Aimport java.util.concurrent.Semaphore;%0A%0Aclass Foo2 %7B
+Semaphore;%0A%0Aclass Foo2 %7B%0A    // %E5%88%9D%E8%AE%BE%E4%B8%BApermit: 1%E7%9A%84%E8%AF%9D, %E9%82%A3%E7%BA%BF%E7%A8%8BB%E5%8F%AF%E8%83%BD%E5%85%88%E4%BA%8EA%E6%89%A7%E8%A1%8C
 %0A   
@@ -483,17 +483,17 @@
 maphore(
-1
+0
 );%0A    p
@@ -584,93 +584,39 @@
 n(%22A
-: %22 + s12.availablePermits());%0A        s12.release();%0A        System.out.println(%22%22 +
+%22);%0A        s12.release(); //%E5%8E%9F%E5%85%88
  s12
@@ -634,18 +634,35 @@
 ermits()
-);
+%E4%B8%BA0, %E7%8E%B0%E5%9C%A8release%E4%B9%8B%E5%90%8E%E4%B8%BA1%E4%BA%86!
 %0A    %7D%0A%0A
@@ -1424,18 +1424,10 @@
 %E6%98%AF: %22
-threetwoone
+CBA
 %22%0A%7D

the init "permit" must be 0, otherwise thread B could get run before thread A