题目
我们提供了一个类:

public class Foo {
  public void first() { print("first"); }
  public void second() { print("second"); }
  public void third() { print("third"); }
}

三个不同的线程将会共用一个 Foo 实例。

    线程 A 将会调用 first() 方法
    线程 B 将会调用 second() 方法
    线程 C 将会调用 third() 方法

请设计修改程序,以确保 second() 方法在 first() 方法之后被执行,third() 方法在 second() 方法之后被执行。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/print-in-order
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题

使用JUC工目包里的Semaphore类

public class OrderThread_Semaphore {
    public void first() { System.out.println("first"); }
    public void second() { System.out.println("second"); }
    public void third() { System.out.println("third"); }
    public static void main(String[] args){
        Semaphore sepmaphor1 = new Semaphore(0);
        Semaphore sepmaphor2 = new Semaphore(0);
        Semaphore sepmaphor3 = new Semaphore(0);
        OrderThread_Semaphore foo = new OrderThread_Semaphore();
        new Thread(() -> {
            foo.first();
            sepmaphor1.release();
        }).start();
        new Thread(() -> {
            try {
                sepmaphor1.acquire();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            foo.second();
            sepmaphor2.release();
        }).start();
        new Thread(() -> {
            try {
                sepmaphor2.acquire();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            foo.third();
            sepmaphor3.release();
        }).start();
    }
}

这里使用了信号量,在当前线程体中持有其它线程体所依赖的信息量,自己的任务执行完成之后再添加一个许可,只有拿到许可的线程体才能执行,这样就保证了线程间的顺序。
同样也可以使用juc里的CountDownLatch来实现:

public class OrderThread_CountdownLatch {
    public void first() { System.out.println("first"); }
    public void second() { System.out.println("second"); }
    public void third() { System.out.println("third"); }
    public static void main(String[] args){
        CountDownLatch latch1 = new CountDownLatch(1);
        CountDownLatch latch2 = new CountDownLatch(1);
        OrderThread_CountdownLatch foo = new OrderThread_CountdownLatch();
        new Thread(() -> {
            foo.first();
            latch1.countDown();
        }).start();
        new Thread(() -> {
            try {
                latch1.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            foo.second();
            latch2.countDown();
        }).start();
        new Thread(() -> {
            try {
                latch2.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            foo.third();
        }).start();
    }
}

步履不停
38 声望13 粉丝

好走的都是下坡路