multi thread 3

Guarded Suspension パターン(Blocking処理)

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

public synchronized getSomething {
    while (precondition is not satisified) {
        try {
            wait();
        } catch (InterruputedException e) {
        }
    }
    (purpose action)
}
public synchronized putSomething {
    (precondition is satisfied)
    notifyAll();
}

getSomething() が実行されたスレッドはpreconditionが満たされるまでwait set で待機する.一方,他のスレッドがputSomething()を実行することで,notifyAll()され,wait set で待機していたスレッドはwhile 文を抜け,purpose action を実行できる.すなわち,Blocking処理を実現している.

このマルチスレッド版のifのような挙動は,このgetSomething のような guarded obj. を持つメソッド(guardedMethod) と,このputSomething のようなインスタンスの状態を変化させるメソッド(stateChangingMethod)と共に実現される.

一定時間が経過しても,状態が変わらない可能性を考慮して,waitにはタイムアウトを指定しておくと良い.

広告

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中