【问题标题】:Semaphores in Java. Why second thread is not waiting?Java中的信号量。为什么第二个线程不等待?
【发布时间】:2012-06-21 22:24:07
【问题描述】:

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

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

我错过了什么吗?

【问题讨论】:

    标签: java multithreading concurrency semaphore


    【解决方案1】:

    new Semaphore(1)1 个初始许可,因此允许一个直接的 acquire 通过。此外,由于release总是允许两个线程立即继续。

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

    【讨论】:

    • 谢谢。我需要在获取和释放之间切换。然后它就完美运行了。
    • 或者只使用更直观的 ReentrantLock。 lock() 和 unlock() 完全按照你的想法去做。
    猜你喜欢
    • 2020-02-29
    • 2020-09-24
    • 1970-01-01
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多