力扣 1117.H2O生成
加强对信号量 Semaphore 的理解
题目链接
对JUC工具类 Semaphore 的理解不是很好,通过调试题解的代码强行解释了一下,等有更进一步理解再继续。
以下是信号量解法
import java.util.concurrent.Semaphore;
public class H2O {
private Semaphore semaphoreH = new Semaphore(2);
private Semaphore semaphoreO = new Semaphore(1);
private Semaphore semaphore1 = new Semaphore(0);
private Semaphore semaphore2 = new Semaphore(0);
public H2O() {
}
public void hydrogen(Runnable releaseHydrogen) throws InterruptedException {
semaphoreH.acquire();// 每次只有2个氢线程可以进入(限流)
semaphore1.release();// 释放信号量1、通知氧线程
semaphore2.acquire();// 阻塞、等待信号量2的通知
// releaseHydrogen.run() outputs "H". Do not change or remove this line.
releaseHydrogen.run();
semaphoreH.release();// 相当于唤醒1个氢线程
}
public void oxygen(Runnable releaseOxygen) throws InterruptedException {
semaphoreO.acquire();// 每次只有1个氧线程可以进入
semaphore2.release(2);// 释放2个信号量2、分别通知2个H线程
semaphore1.acquire(2);// 阻塞、等待2个信号量1的通知
// releaseOxygen.run() outputs "O". Do not change or remove this line.
releaseOxygen.run();
semaphoreO.release();// 相当于唤醒1个氧线程
}
public static void main(String[] args) {
H2O h2o = new H2O();
int n = 5;
new Thread(() -> {
try {
for (int i = 0; i < 2*n; i++) {
h2o.hydrogen(() -> System.out.println("H"));
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
new Thread(() -> {
try {
for (int i = 0; i < n; i++) {
h2o.oxygen(() -> System.out.println("O"));
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
}
调试的代码来源
作者:hansin1997
链接:https://leetcode-cn.com/problems/building-h2o/solution/xin-hao-liang-by-hansin1997-3/
来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。