multi thread 4

Balking パターン(Non-Blocking処理)

Balk:(途中で)辞めること.野球のボーク.

いよいよ非同期処理を学ぶ.処理速度の向上が見込める.

状態を持っているオブジェクトがある.このオブジェクトは状態が特定の条件(precondition)を満たした時だけ目的の処理(purpose action)をスレッドに動作させるが,(待ち続けることはせず)条件を満たしていなければ目的の処理を行うことは諦める.

public synchronized getSomething {
    if (precondition is not satisified) {
        return;
    }
    (purpose action)
}
public synchronized putSomething {
    (precondition is satisfied)
}

getSomething() はここでも guardedMethod となる.しかし,条件を満たしていないときは目的の処理を行うことは諦める.putSomething() は stateChangingMethod である.

処理を諦めたスレッドの返り値としてのbalk 発生の表現方法にはいくつか考えられる.

  • balkの発生を無視:呼び出し側スレッドにはbalkの発生を伝えない.(上記の例)
  • balkの発生を戻り値で表現:balkの発生をbooleanで表現.参照型を戻り値とする場合はnullを返しても良い
  • balkの発生を例外で表現:returnではなくthrow new Exception とする.

Blocking処理とNonBlocking処理の中間として,条件を満たすまで一定時間待つということが考えられる.

while (precondition is not satisfied) {
    try {
        wait(1000);
    } catch (InterruptedException e) {
    }
}

で1000msec間待つことができる.この時にスレッドが,wait setから出るのは次のいずれかが実行された時

  • notify()/notifiyAll() が実行された時:wait setで待機しているスレッドが起き,オブジェクトのロックを取る.
  • interrupt メソッドが実行された時:InterruptedException を投げる.
  • timeout が実行された時:notify()/notifiyAll() が実行された時と同様にオブジェクトのロックを取る.

この時,呼び出し側のスレッドのwaitからはnotifyされたのかタイムアウトしたのかは区別することができない.これはJavaの残念な仕様として良く知られたものであるらしい.

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中