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

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





> > この場合、thisとthは同じオブジェクトですか?
> 同じではないかと思うのですが・・・・
> 私は、synchronized(this)にすると、カレントのスレッドが
> 対象になると思っているのですが、それがそもそも間違いなのでしょうか?

Threadクラスのインスタンス(オブジェクト)とスレッドを分けて考えてください。

thはThreadクラスのオブジェクトで、thisはStop_Resumeクラスのオブジェクトを
指しています。

スレッドは、処理の流れだと思ってください。この場合、2つの独立した処理の
流れがあって、2つの処理の中で同時に実行されては困る部分をsynchronizedを
使って同期させているのです。

同期処理というのを下の図のように考えると良いでしょう。
横軸を時間だと思ってください。
----****---- は処理の流れ(スレッド)で****の部分はsynchronizeして同期させ
たい部分です。

****の部分を同期させないと下のようにそれぞれのスレッドが独立に処理されます。

Thread A --------------**********-----------
Thread B -------------------*********-------
                            ^^^^^ ここの部分が同時に実行されてしまう。

Thread A と Thread B で****の部分が重なっている部分がありますね。
ここを重ならないように同期処理をすると次のようになります。

Thread A --------------**********-----------
Thread B -------------------     *********-------
                            ^ここでThread B は待たされる。

カレントスレッドというのは、それぞれの処理部分でThread AであったりThread B
であったりします。
ですので、カレントスレッドというのは1つのスレッドのことを指しているのでは
なく、ましてやオブジェクトのことを指しているのではありません。

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

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