2

静的セマフォインスタンスが1つあります。

    Semaphore semaphore = new Semaphore(1);

これで、2つのスレッド(送信スレッドと受信スレッド)ができました。

スレッドの送信:

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秒間待機します。これは、4秒の遅延で出力されることを意味し ますが、このコードを実行すると、3つの値すべてがすぐに出力されます。なんで?System.out.println("3");

私は何かが足りないのですか?

4

1 に答える 1

3

Aには最初の許可new Semaphore(1)が1つあるため、すぐに1つ通過できます。さらに、aは常に許可されているため、両方のスレッドがすぐに進行します。acquirerelease

あることを他の前に強制的に発生させるには、を使用できますnew Semaphore(0)。これにより、スレッド呼び出しはスレッドの実行acquire待機releaseします。

于 2012-06-21T22:26:55.607 に答える