我有一个静态信号量实例。
Semaphore semaphore = new Semaphore(1);
现在我有两个线程(发送线程和接收线程)
发送帖子:
public class SendingThread implements Runnable {
private Semaphore semaphore;
public SendingThread(Semaphore semaphore){
this.semaphore = semaphore;
}
@Override
public void run() {
try {
System.out.println("1");
Thread.sleep(4000);
this.semaphore.acquire();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
e.printStackTrace();
}
}
}
并接收线程:
public class RecievingThread implements Runnable {
private Semaphore semaphore;
public RecievingThread(Semaphore semaphore){
this.semaphore = semaphore;
}
@Override
public void run() {
System.out.println("2");
this.semaphore.release();
System.out.println("3");
}
}
根据我的理解,当我开始这2个线程时,接收线程将等待 4秒钟直到
发送线程将通知它接收线程可以继续。这意味着System.out.println("3");
将以4秒延迟打印,但是当我运行此代码时,将立即打印所有三个值。为什么呢?
我错过了什么吗?
答案 0 :(得分:3)
new Semaphore(1)
有 1个初始许可,因此可以立即通过acquire
个release
。此外,由于new Semaphore(0)
总是允许两个线程立即进行。
要强迫一件事发生在另一件事之前,您可以使用acquire
。这将强制线程调用release
等待以执行{{1}}的线程。