gpt4 book ai didi

java - Java中的信号量。为什么第二个线程不等待?

转载 作者:行者123 更新时间:2023-12-03 12:56:35 24 4
gpt4 key购买 nike

我有一个静态信号量实例。

    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 秒延迟,但是当我运行此代码时,所有三个值都会立即打印。为什么?

我错过了什么吗?

最佳答案

一个 new Semaphore(1) 1个初始许可证因此允许立即 acquire通过。此外,由于 release始终允许两个线程立即进行。

要强制一件事先于另一件事发生,您可以使用 new Semaphore(0) .这将强制线程调用 acquire等待线程执行 release .

关于java - Java中的信号量。为什么第二个线程不等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11147682/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com