Java中的信号量。为什么第二个帖子没有等待?

时间:2012-06-21 22:24:08

标签: java multithreading concurrency semaphore

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

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

我错过了什么吗?

1 个答案:

答案 0 :(得分:3)

new Semaphore(1) 1个初始许可,因此可以立即通过acquirerelease。此外,由于new Semaphore(0) 总是允许两个线程立即进行。

要强迫一件事发生在另一件事之前,您可以使用acquire。这将强制线程调用release 等待以执行{{1}}的线程。