next up previous
Next: 14.2 通知メソッドnotifyAll, notify Up: 14 待ちと通知のメソッド Previous: 14 待ちと通知のメソッド

14.1 一時停止・ロック解放メソッドwait

waitメソッドは,オブジェクトのロックをアトミック(atomically) に解放します. スレッドの一時停止とロックの解放がアトミックであるというのは, それらが分割されることなく一緒に行われることである. もし,そうでなかったらば,ロックが解放された後で,スレッドが一時停止する 前に通知が行われてしまう可能性があり,その通知はスレッドに 対して何も影響しないので実質的に失われてしまうことになる. 条件を待つスレッドは,常に次のようなパターンで書くことになる.

synchronized void doWhenCondition() {
  while (!condition) wait();
  ... conditionがtrueの時に処理すべきことを行う.
}
waitメソッドの引数に関しては, wait(long timeout), wait(long timeout, int nanos) という 形の引数をとり,timeoutミリ秒+nanosナノ秒後に自動的にwaitから戻ってくる ことになる.wait()はtimeoutが0で,通知がなされるまでずっと待ち続けるという ことになる. タイムアウト期間が終わることによってwaitが完了した場合には, スレッドに通知されるだけで,タイムアウトの発生を示すものではない. スレッドがタイムアウトしたかどうかを知る必要がある場合には, スレッド自身で経過時間を調べる必要がある. タイムアウトを使用するのは,条件が満たされるべきところでなんらかの理由で 満たされない状況から回復できるように防御的に利用したいときである.

generated through LaTeX2HTML. M.Inaba 平成18年5月7日