【Java】【非同期】セマフォ(Semaphore)

セマフォ(Semaphore)とは?

 * 同時にアクセスできるプログラム数を制限するために使われる
 * 詳細は、以下の関連記事を参照のこと。
https://blogs.yahoo.co.jp/dk521123/37076571.html

■ 主なメソッド

https://docs.oracle.com/javase/jp/6/api/java/util/concurrent/Semaphore.html

acquire()

 * 実行権を取得する

release()

 * セマフォー・カウントの 1 つが解放する

■ サンプル

SampleTask.java

import java.util.Calendar;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

public class SampleTask implements Runnable {
   private Semaphore semaphore;
   private String name;

   public SampleTask(Semaphore semaphore, String name) {
      System.out.println(Calendar.getInstance().getTime().toString()
            + " Creat Task " + name);
      this.semaphore = semaphore;
      this.name = name;
   }

   @Override
   public void run() {
      try {
         System.out.println(Calendar.getInstance().getTime().toString()
               + " Start " + this.name);

         System.out.println(Calendar.getInstance().getTime().toString()
               + " acquire() calling " + this.name);
         this.semaphore.acquire();

         System.out.println(Calendar.getInstance().getTime().toString()
               + " sleep() calling " + this.name);
         TimeUnit.SECONDS.sleep(1);

         System.out.println(Calendar.getInstance().getTime().toString()
               + " ★注目★ release() calling " + this.name);
         this.semaphore.release();
      } catch (Exception ex) {
         ex.printStackTrace();
      } finally {
         System.out.println(Calendar.getInstance().getTime().toString()
               + " End " + this.name);
      }
   }
}

Main.java

import java.util.concurrent.Semaphore;

public class Main {
   public static void main(String[] args) {
      final Semaphore semaphore = new Semaphore(2);
      for (int i = 0; i < 5; i++) {
         Thread thread = new Thread(new SampleTask(semaphore, "TaskId" + i));
         thread.start();
      }
   }
}
出力結果
#  セマフォのpermit数を2にしているので、
# 最初の2つのスレッドは即処理が開始できて、
# 3~5つ目のスレッドがブロックされている

Thu Nov 20 18:12:48 JST 2014 Creat Task TaskId0
Thu Nov 20 18:12:48 JST 2014 Creat Task TaskId1
Thu Nov 20 18:12:48 JST 2014 Creat Task TaskId2
Thu Nov 20 18:12:48 JST 2014 Creat Task TaskId3
Thu Nov 20 18:12:48 JST 2014 Start TaskId0
Thu Nov 20 18:12:48 JST 2014 acquire() calling TaskId0
Thu Nov 20 18:12:48 JST 2014 sleep() calling TaskId0
Thu Nov 20 18:12:48 JST 2014 Start TaskId1
Thu Nov 20 18:12:48 JST 2014 acquire() calling TaskId1
Thu Nov 20 18:12:48 JST 2014 sleep() calling TaskId1
Thu Nov 20 18:12:48 JST 2014 Start TaskId2
Thu Nov 20 18:12:48 JST 2014 Creat Task TaskId4
Thu Nov 20 18:12:48 JST 2014 acquire() calling TaskId2
Thu Nov 20 18:12:48 JST 2014 Start TaskId4
Thu Nov 20 18:12:48 JST 2014 acquire() calling TaskId4
Thu Nov 20 18:12:48 JST 2014 Start TaskId3
Thu Nov 20 18:12:48 JST 2014 acquire() calling TaskId3
Thu Nov 20 18:12:49 JST 2014 ★注目★ release() calling TaskId0
Thu Nov 20 18:12:49 JST 2014 ★注目★ release() calling TaskId1
Thu Nov 20 18:12:49 JST 2014 End TaskId1
Thu Nov 20 18:12:49 JST 2014 End TaskId0
Thu Nov 20 18:12:49 JST 2014 sleep() calling TaskId4
Thu Nov 20 18:12:49 JST 2014 sleep() calling TaskId2
Thu Nov 20 18:12:50 JST 2014 ★注目★ release() calling TaskId2
Thu Nov 20 18:12:50 JST 2014 End TaskId2
Thu Nov 20 18:12:50 JST 2014 sleep() calling TaskId3
Thu Nov 20 18:12:50 JST 2014 ★注目★ release() calling TaskId4
Thu Nov 20 18:12:50 JST 2014 End TaskId4
Thu Nov 20 18:12:51 JST 2014 ★注目★ release() calling TaskId3
Thu Nov 20 18:12:51 JST 2014 End TaskId3


関連記事

java.util.concurrent

java.util.concurrent について
http://blogs.yahoo.co.jp/dk521123/32538961.html
CountDownLatch ~カウントダウンラッチ~
http://blogs.yahoo.co.jp/dk521123/33538428.html
ExecutorService / Runnableインタフェース
http://blogs.yahoo.co.jp/dk521123/33665815.html
ScheduledExecutorService ~スケジューラ~
http://blogs.yahoo.co.jp/dk521123/33934102.html
ExecutorService / Callable / Future インタフェース
http://blogs.yahoo.co.jp/dk521123/34213161.html

タイマー

TaskTimer
http://blogs.yahoo.co.jp/dk521123/33926465.html

C#

セマフォ(Semaphore)
https://blogs.yahoo.co.jp/dk521123/38094772.html

その他

【非同期】非同期・スレッドに関する用語
https://blogs.yahoo.co.jp/dk521123/37076571.html