Java concurrentパッケージ下の同時開発支援クラス(三)Semaphore


テストコード:
public class SemaphoreSample {
    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(5);
        for (int i = 0; i < 10; i++) {
            Thread t = new SemaphoreWorker(semaphore);
            t.start();
        }
    }
}

class SemaphoreWorker extends Thread {
    private Semaphore semaphore;

    SemaphoreWorker(Semaphore semaphore) {
        this.semaphore = semaphore;
    }

    @Override
    public void run() {
        try {
            System.out.println(getName() + "is waiting for a permit!");

            semaphore.acquire();

            System.out.println(getName() + "acquired a permit!");

            Thread.sleep(10000);

            System.out.println(getName() + "executed!");

        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {

            System.out.println(getName() + "released a permit!");

            semaphore.release();
        }
    }
}

テスト結果:
Thread-4 is waiting for a permit!
Thread-4 acquired a permit!
Thread-3 is waiting for a permit!
Thread-3 acquired a permit!
Thread-2 is waiting for a permit!
Thread-6 is waiting for a permit!
Thread-6 acquired a permit!
Thread-0 is waiting for a permit!
Thread-0 acquired a permit!
Thread-2 acquired a permit!
Thread-9 is waiting for a permit!
Thread-1 is waiting for a permit!
Thread-5 is waiting for a permit!
Thread-8 is waiting for a permit!
Thread-7 is waiting for a permit!
Thread-0 executed!
Thread-0 released a permit!
Thread-2 executed!
Thread-2 released a permit!
Thread-4 executed!
Thread-4 released a permit!
Thread-5 acquired a permit!
Thread-3 executed!
Thread-3 released a permit!
Thread-6 executed!
Thread-8 acquired a permit!
Thread-1 acquired a permit!
Thread-9 acquired a permit!
Thread-6 released a permit!
Thread-7 acquired a permit!
Thread-8 executed!
Thread-8 released a permit!
Thread-7 executed!
Thread-7 released a permit!
Thread-9 executed!
Thread-9 released a permit!
Thread-1 executed!
Thread-1 released a permit!
Thread-5 executed!
Thread-5 released a permit!

Semaphoreカウント信号量.概念的には、信号量はライセンスセットを維持する.必要に応じて、ライセンスが使用可能になる前に各acquire()がブロックされ、ライセンスが取得されます.各release()にライセンスが追加され、ブロックされている取得者が解放される可能性があります.1つを取得する前に、各スレッドは信号量から許可を取得し、使用可能であることを保証しなければならない.スレッドが終了すると、アイテムをプールに戻し、許可を信号量に戻し、他のスレッドがアイテムを取得できるようにします.
1.コンストラクションメソッドSemaphore(int permits)は、指定されたライセンス数と不公平な公平な設定を持つSemaphoreを作成します.すなわち、同時にどのスレッドにアクセスできるか2.構築方法Semaphore(int permits,boolean fair)fairがtrueの場合、スレッドはFIFO順にライセンスを取得し、falseの場合は競合取得3となる.public void acquire()throws InterruptedException{}ライセンスpublic void acquire(int permits)throws InterruptedException{}permitsライセンスpublic void release()ライセンスpublic void release(int permits){permits解放permitsライセンスacquire()ライセンスを取得するために使用され、ライセンスが取得できなければ待機します.許可を得るまで.release()は、ライセンスを解放するために使用されます.ライセンスを解放するには、ライセンスを取得してからでなければなりません.4.public boolean tryAcquire() { }; ライセンスを取得してみます.成功したらtrueを返し、失敗したらfalse public boolean tryAcquire(long timeout,TimeUnit unit)throws InterruptedException{}を返します.指定した時間内に成功した場合はtrueを返し、そうでない場合はfalse public boolean tryAcquire(int permits){}を返します.permits個のライセンスを取得してみて、成功したらすぐにtrueを返し、失敗したらすぐにfalse public boolean tryAcquire(int permits,long timeout,TimeUnit unit)throws InterruptedException{}を返します.permits個のライセンスを取得しようとしますが、指定した時間内に成功した場合はtrueを返し、そうでない場合はfalseを返します.