[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends:00477] Re: R e: Thread の一時停止と再開について





> >  どこの処理がどう間違っていて、
> >  どこをどう変更したら動くようになったのかぐらいは報告しましょう。
> 
> 大変失礼しました。
> 
> 私は、
> public synchronized void mousePressed(MouseEvent e){...
> と、runメソッド内の
> synchronized(this){...
> でスレッドthとの同期が保てると解釈していたのですが、
> runメソッド及びmousePressedメソッドは共にメインのスレッドの方で
> 実行されていたようなので、

この辺りの解釈が間違っているようなので訂正させて頂きますと、

run()メソッドは、スレッドthで実行され、mousePressed()メソッドはGUIスレッド
で実行されます。
問題なのはそれぞれのスレッドが別々のモニタを使って同期しようとしていたこと
です。

スレッドの同期はモニタ(あるいはロック)という機構で実現されます。
スレッドはsynchronized宣言されたメソッドの入口かsynchronized (object) {}
ブロックの入口のところでモニタを取得しようとします。
モニタを取得することが出来ればそのままメソッドあるいはブロック内の処理を
行います。

ところが他のスレッドがモニタを所有している場合には、モニタを取得することが
できません。その場合、モニタが解放されるまで待たされます。
モニタが解放されるのは、synchronized宣言されたメソッドを抜けるときか、
synchronized (object) {}ブロックを抜けるとき、wait()メソッドが呼び出された
とき※です。

このようにして、synchronized宣言されたメソッドやsynchronized (object) {}
ブロック内の処理を同時に実行することが出来ないようにしています。

※wait()メソッドでモニタが解放されるのは、待機中はモニタを解放して、notify()
メソッドを呼び出せるようにしなければならないためです。

-- 
/**
 *  大崎 洋平  (Yohei Osaki)
 *
 *  @e-mail  <osaki@xxxxxxxxxxxxxx>
 */

------------------------------------------------------------------------
目指せ!! 商品券20万,旅行券20万,デジカメ,PS2,Xbox…ホームページコンテスト
             http://isweb.infoseek.co.jp/hp_daiou/?svx=971122