题目
我们提供了一个类:
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();
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。