my_util
クラス Semaphore

java.lang.Object
  拡張my_util.Semaphore
直系の既知のサブクラス:
BinSemaphore

public class Semaphore
extends java.lang.Object

同時に複数のスレッドが共用的に獲得できるセマフォです。 また、一つだけのスレッドが専有的に獲得することもできます。 あるスレッドから専有的に獲得されている間は、他のスレッドは セマフォ獲得できず (待機動作指定されている場合) タイムアウト制御 された待機動作を行います。

コンストラクタにスレッドを指定することで、あらかじめ獲得済みの状態 になっているセマフォを作成することもできます。 その際に共用的に獲得するか占有的に獲得するのかについても 指定できます。

スレッド間で共有するオブジェクト (共有オブジェクト) を コンストラクタに指定することでセマフォに関連付けることもできます。

関連項目:
BinSemaphore

フィールドの概要
static int DEFAULT_CNT_OF_SHARING_OWNERS
          同時にセマフォを獲得できるスレッド数の既定値 (= 16) です。
static int INFINITE
          セマフォ獲得のために無限に待つ際のタイムアウト値 (= 0) です。
static int MIN_CNT_OF_OWNERS
          同時にセマフォを獲得できるスレッド数の最小値 (= 1) です。
 
コンストラクタの概要
Semaphore()
          明示的なスレッド間共有オブジェクトが指定されていない、 どのスレッドからも獲得されていないセマフォを作成します。
Semaphore(int max_sharers)
          共用的な獲得を同時に行えるスレッド数を指定され、 明示的なスレッド間共有オブジェクトが指定されていない、 どのスレッドからも獲得されていないセマフォを作成します。
Semaphore(java.lang.Object o)
          明示的なスレッド間共有オブジェクトを指定され、 どのスレッドからも獲得されていないセマフォを作成します。
Semaphore(java.lang.Object o, int max_sharers)
          明示的なスレッド間共有オブジェクトと 共用的な獲得を同時に行えるスレッド数を指定され、 どのスレッドからも獲得されていないセマフォを作成します。
Semaphore(java.lang.Thread me, boolean sharing, java.lang.Object o)
          同時にセマフォを共用的に獲得できるスレッド数が DEFAULT_CNT_OF_SHARING_OWNERS で既定とされる値で、 me スレッドから専有的に獲得され、 明示的なスレッド間共有オブジェクトを指定されたセマフォを 作成します。
Semaphore(java.lang.Thread me, boolean sharing, java.lang.Object o, int max_sharers)
          引数 me で指定されたスレッドからあらかじめ獲得された状態で セマフォを作成します。
Semaphore(java.lang.Thread me, java.lang.Object o)
          明示的なスレッド間共有オブジェクトを指定され、 me スレッドから専有的に獲得されたセマフォを作成します。
Semaphore(java.lang.Thread me, java.lang.Object o, int max_sharers)
          明示的なスレッド間共有オブジェクトと 共用的なセマフォ獲得を同時に行えるスレッド数を指定され、 me スレッドから専有的に獲得されたセマフォを作成します。
 
メソッドの概要
 java.lang.Object get_exclusive_object(java.lang.Thread me)
          セマフォに関連付けられたスレッド間共有オブジェクトを取得する。
 boolean leave(java.lang.Thread me)
          獲得したセマフォを解放する。
 boolean take(java.lang.Thread me, boolean blocking)
          タイムアウト動作を行わず例外も投げないように、 専有的なセマフォ獲得を行う。
 boolean take(java.lang.Thread me, boolean sharing, boolean blocking)
          タイムアウト動作を行わず例外も投げないように、 専有的または共用的なセマフォ獲得を行う。
 boolean take(java.lang.Thread me, boolean sharing, boolean blocking, long timeout)
          me スレッドからのセマフォを獲得を試みる。
 
クラス java.lang.Object から継承したメソッド
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

フィールドの詳細

DEFAULT_CNT_OF_SHARING_OWNERS

public static final int DEFAULT_CNT_OF_SHARING_OWNERS
同時にセマフォを獲得できるスレッド数の既定値 (= 16) です。

関連項目:
定数フィールド値

MIN_CNT_OF_OWNERS

public static final int MIN_CNT_OF_OWNERS
同時にセマフォを獲得できるスレッド数の最小値 (= 1) です。

関連項目:
定数フィールド値

INFINITE

public static final int INFINITE
セマフォ獲得のために無限に待つ際のタイムアウト値 (= 0) です。

関連項目:
定数フィールド値
コンストラクタの詳細

Semaphore

public Semaphore(java.lang.Thread me,
                 boolean sharing,
                 java.lang.Object o,
                 int max_sharers)
引数 me で指定されたスレッドからあらかじめ獲得された状態で セマフォを作成します。 引数 sharing の真偽 (true/false) により、セマフォの共用的な獲得 (true 時)と専有的な獲得 (false 時) のいずれかを行います。 引数 o で指定されたオブジェクトがこのセマフォと関連付けられ、 複数のスレッド間の明示的な共有オブジェクトとなります。 引数 max_sharers に指定された値が同時にセマフォを共用的に獲得 できるスレッド数になります。

パラメータ:
me - セマフォをあらかじめ獲得するスレッド。 null が指定された場合、どのスレッドからも獲得されて いないセマフォが作成されます
sharing - me スレッドがセマフォをあらかじめ獲得する際の モードを指定します。true ならば他のスレッドからも 同時獲得が可能な共用的な獲得を行い、false ならば 他スレッドからは同時に獲得できない専有的な獲得を 行います
o - セマフォに明示的に関連付ける スレッド間共有オブジェクト。 null が指定された場合、共有オブジェクトと関連付け られていないセマフォが作成されます
max_sharers - 共用的な獲得を同時に行えるスレッド数を 指定します。 MIN_CNT_OF_OWNERS よりも小さな値を指定してはいけません。

Semaphore

public Semaphore(java.lang.Thread me,
                 boolean sharing,
                 java.lang.Object o)
同時にセマフォを共用的に獲得できるスレッド数が DEFAULT_CNT_OF_SHARING_OWNERS で既定とされる値で、 me スレッドから専有的に獲得され、 明示的なスレッド間共有オブジェクトを指定されたセマフォを 作成します。 new Semaphore(me, sharing, o, DEFAULT_CNT_OF_SHARING_OWNERS); と同じです。


Semaphore

public Semaphore(java.lang.Thread me,
                 java.lang.Object o,
                 int max_sharers)
明示的なスレッド間共有オブジェクトと 共用的なセマフォ獲得を同時に行えるスレッド数を指定され、 me スレッドから専有的に獲得されたセマフォを作成します。 new Semaphore(me, false, o, max_sharers); と同じです。


Semaphore

public Semaphore(java.lang.Thread me,
                 java.lang.Object o)
明示的なスレッド間共有オブジェクトを指定され、 me スレッドから専有的に獲得されたセマフォを作成します。 new Semaphore(me, false, o); と同じです。


Semaphore

public Semaphore(java.lang.Object o,
                 int max_sharers)
明示的なスレッド間共有オブジェクトと 共用的な獲得を同時に行えるスレッド数を指定され、 どのスレッドからも獲得されていないセマフォを作成します。 new Semaphore(null, o, max_sharers); と同じです。


Semaphore

public Semaphore(java.lang.Object o)
明示的なスレッド間共有オブジェクトを指定され、 どのスレッドからも獲得されていないセマフォを作成します。 new Semaphore(null, o); と同じです。


Semaphore

public Semaphore(int max_sharers)
共用的な獲得を同時に行えるスレッド数を指定され、 明示的なスレッド間共有オブジェクトが指定されていない、 どのスレッドからも獲得されていないセマフォを作成します。 new Semaphore(null, max_sharers); と同じです。


Semaphore

public Semaphore()
明示的なスレッド間共有オブジェクトが指定されていない、 どのスレッドからも獲得されていないセマフォを作成します。 new Semaphore(null); と同じです。

メソッドの詳細

take

public boolean take(java.lang.Thread me,
                    boolean sharing,
                    boolean blocking,
                    long timeout)
             throws java.lang.Exception,
                    TimeoutException
me スレッドからのセマフォを獲得を試みる。 sharing が true ならば共用的な獲得を、 false ならば占有的な獲得を行う。 blocking が true でセマフォ獲得できない場合に待機状態になる。 待機状態を行う際に、timeout で指定されたミリ秒数で タイムアウト動作を行う。 タイムアウトした場合と他スレッドから割り込まれた場合に 例外を発生する。

パラメータ:
me - スレッド獲得を行うスレッド。
sharing - 共用的獲得 (true) と専有的獲得 (false) を指定する
blocking - 獲得できない場合に待機状態に入る (true) か否か (false) を指定する
timeout - 獲得できない場合の待機タイムアウト時間をミリ秒数 で指定する。 1 未満の値を指定した場合、タイムアウト動作は 行わない。
戻り値:
  • true - セマフォの獲得ができたことを示す
  • false - 非ブロッキング時にセマフォの獲得が できなかった、 あるいは、以下のいずれかの場合を示す。
    1. me スレッドが既にセマフォ獲得している
    2. me スレッドに null が指定されている
    3. コンストラクタの max_sharers に MIN_CNT_OF_OWNERS 未満の値を設定していた
例外:
TimeoutException - 待機タイムアウトした場合。 例外メッセージは "Semaphore.take(): Timeout (ミリ秒数)"
java.lang.InterruptedException - me スレッドが他のスレッドから interrupt() メソッド呼び出しで割り込まれた場合。
java.lang.Exception

take

public boolean take(java.lang.Thread me,
                    boolean sharing,
                    boolean blocking)
タイムアウト動作を行わず例外も投げないように、 専有的または共用的なセマフォ獲得を行う。 take(me, sharing, blocking, INFINITE); と同じ。


take

public boolean take(java.lang.Thread me,
                    boolean blocking)
タイムアウト動作を行わず例外も投げないように、 専有的なセマフォ獲得を行う。 take(me, false, blocking); と同じ。


get_exclusive_object

public java.lang.Object get_exclusive_object(java.lang.Thread me)
                                      throws java.lang.Exception
セマフォに関連付けられたスレッド間共有オブジェクトを取得する。

パラメータ:
me - スレッド間共有オブジェクトを取得するスレッド
戻り値:
  • null - スレッド間共有オブジェクトが関連付け られていない場合
  • 非 null - スレッド間共有オブジェクト
例外:
java.lang.Exception - me スレッドがセマフォ獲得をしていない 場合。例外メッセージは "Semaphore: This thread has not taken this semaphore."
java.lang.Exception - コンストラクタで共用的な獲得を同時に 行うスレッド数 max_sharers を MIN_CNT_OF_OWNERS 未満に指定していた場合。例外メッセージは "Semaphore: Constructor had taken the illegal `max_sharers' argument, yet"

leave

public boolean leave(java.lang.Thread me)
獲得したセマフォを解放する。解放した際に、セマフォ獲得待機状態の 他スレッドがある場合、notifyAll() でセマフォが獲得可能になった ことを通知する。

パラメータ:
me - セマフォを獲得しているスレッド
戻り値:
  • true - セマフォが解放されたことを示す。
  • false - 以下のいずれかの場合を示す。
    1. me スレッドがセマフォを獲得していない
    2. コンストラクタの max_sharers に MIN_CNT_OF_OWNERS 未満の値を設定していた