スレッドについて

こんにちは。よしときです。 今回はスレッドの章を勉強したので紹介します。 実はスレッドについては以前にあまり触れなかったので今回が初めて出会うこととなりましたので苦労しました。 まずスレッドの作り方から学んだのですが、スレッドを生成する方法は二つあるようですね。
  1. Threadクラスの拡張クラスを作る
  2. Runnableインターフェースを実装したクラスを作る
となっているようです。 それぞれメリット・デメリットがあるようで、
  1. メリット:とにかく手軽なこと。開始したいときはstartメソッドを呼ぶだけ!デメリット:他のクラスの拡張クラスにすることができない
  2. メリット:他クラスの拡張クラスを利用できる!デメリット:別途Threadクラスのインスタンスを生成してやり、そのstartメソッドを呼び出さなくてはならない。runメソッドが絶対に必要
となっています! さて、これからが本題。

マルチスレッド

なぜこの章で苦労したかというとこのマルチスレッドの存在でした。 スレッドを複数動かすと、同インスタンスにおいて実行されるメソッドの順番がはちゃめちゃになり不具合がおきるとのこと。 これを修正するのにsynchronizedというキーワードが出てきました。 これはこのキーワードがついたメソッドやブロックのをロックして他のスレッドがそのメソッドを操作できないようにするものです。 つまりメソッドやブロックを一つの部屋だとしたとき、その部屋に入った人が鍵をかけるようなものです。と表現してありました。 そして処理しているスレッドが処理を終了すると鍵を解除するようです。 結構分かりやすくイメージできました。 ここからはマルチスレッドでの動きを制御するメソッド(start,run,join,sleep,notify)を学びながらいくつか例題をやっていきました。 この例題の流れを追いかけるのが難しかったので紹介します。 一つ一つ慎重に追いかけないと難しかったです。今まで一本の線を上から下に追いかけていたものが、ここで一気にとびとびに、というか分岐されているのでこんがらがってしまいました。 ここで決め手になるのはロックの解放が決め手みたいです。 どこをロックして、いつ解放して、解放されたらどこが起動するのかというところです。

ロックについて

ロックとはsynchronizedされたとき、そのメソッドがほかのスレッドが処理できないように鍵をかけることです。 つまりロックがかかると他のスレッドは動作待ちになります。 しかし、ロックをかけたスレッドがwait状態(ウェイトセット)になると今度は動作待ちだったスレッドが実行することになります。 そしてnotifyがかかるまで一時停止されます。 注意すべきはnotifyAllを発行したスレッドが、そのオブジェクトのロックを解放しない限り、他のスレッドは走り出しません。 ということです。 いやーーーー難しい。。使い方を覚えるというよりとにかくイメージを掴むことが大事なのかなと思いました。

id-entity.jp

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です