■ セマフォ(Semaphore)とは?
* 同時にアクセスできるプログラム数を制限するために使われる * 詳細は、以下の関連記事を参照のこと。https://blogs.yahoo.co.jp/dk521123/37076571.html
■ 主なメソッド
https://docs.oracle.com/javase/jp/6/api/java/util/concurrent/Semaphore.htmlacquire()
* 実行権を取得する
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
参考文献
API仕様
Semaphorehttps://docs.oracle.com/javase/jp/6/api/java/util/concurrent/Semaphore.html
AbstractQueuedSynchronizer
https://docs.oracle.com/javase/jp/6/api/java/util/concurrent/locks/AbstractQueuedSynchronizer.html
一般サイト
Semaphorehttp://d.hatena.ne.jp/AWAWA/20080424/1209020980
http://www.ibm.com/developerworks/jp/java/library/j-5things5.html
http://www.eeb.co.jp/wordpress/?p=285
AbstractQueuedSynchronizer
http://d.hatena.ne.jp/torutk/20120226/p1
http://d.hatena.ne.jp/aKiRa/20110824/1314200356
関連記事
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
タイマー
TaskTimerhttp://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