Javaのマルチスレッドセマフォツールの使い方は?

セマフォはJavaのマルチスレッドにおいて重要なツールであり、複数のスレッドが共有リソースにアクセスすることを制御するために使用されます。セマフォは、同時にリソースにアクセスするスレッドの数を制御するカウントセマフォと見なすことができます。

セマフォの一般的な使用方法は次のとおりです:

  1. acquire()メソッド: ライセンスを取得し、利用可能なライセンスがない場合はスレッドがブロックされ、利用可能なライセンスがあるまで待機します。
  2. release()メソッド: 許可を解放し、他のスレッドが許可を取得できるようにします。ブロックされているスレッドが許可を待っている場合、その中から1つのスレッドが許可を取得します。

下記はSemaphoreを使用したサンプルコードです。

import java.util.concurrent.Semaphore;

public class SemaphoreExample {
    public static void main(String[] args) {
        // 创建Semaphore对象,指定许可的数量为3
        Semaphore semaphore = new Semaphore(3);

        // 创建10个线程
        for (int i = 0; i < 10; i++) {
            final int threadNum = i;
            new Thread(() -> {
                try {
                    // 获取许可
                    semaphore.acquire();
                    System.out.println("Thread " + threadNum + " is running");
                    Thread.sleep(1000);
                    System.out.println("Thread " + threadNum + " is finished");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    // 释放许可
                    semaphore.release();
                }
            }).start();
        }
    }
}

上記のコードは、Semaphoreオブジェクトを作成し、許可数を3と指定しています。そして、10個のスレッドを作成し、各スレッドが実行する前に許可を取得します。許可が利用できない場合、スレッドはブロックされます。タスクの実行が完了した後、許可を解放し、他のスレッドが許可を取得して継続的に実行できるようにします。

上記のコードを実行すると、最大で3つのスレッドが同時に実行され、他のスレッドはブロックされ、許可が解放されるのを待ちます。これにより、共有リソースへのアクセスを効果的に制御できます。

bannerAds