题目
咱们提供了一个类: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 Foo{ 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); Foo foo = new Foo(); 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(); }}
这里应用了信号量,在以后线程体中持有其它线程体所依赖的信息量,本人的工作执行实现之后再增加一个许可,只有拿到许可的线程体能力执行,这样就保障了线程间的程序。