スレッドとアニメーション (1/9)
作成:2010-01-14 21:04
更新:2010-01-14 21:04
更新:2010-01-14 21:04
■スレッドとは何か?
今まで作成してきたプログラムは、全て「クリックしたら何かの処理を実行し、全て終わったら元に戻る」という形のものでした。つまり、常に動いているのは1つの処理だけだったわけです。Javaでは全ての処理はイベントによって呼び出されますが、メソッド実行中は何か操作をしてもイベントは発生しません。実行中のメソッドが終了して、初めて次のイベントが認識されるようになるのです。つまり、同時に複数のメソッドを平行して実行することは(今のところ)できないわけです。
けれど、時には「何かをしながら別の作業を行なう」というようなことが必要となる場合もあります。そのよい例が、アニメーションです。
画面にちょっとしたアニメーションを表示したい、という場合、「アニメーション表示中は他の作業は何もできない」というのではあんまり意味がありません。普通に作業を行えて、それ以外に常にアニメーションが動いている、というようになるのが理想でしょう。となると、「アニメーションを動かす」というメソッドが常に動いていながら、同時にユーザの操作などに対応したイベント処理がきちんと機能していなければいけないことになります。
このような場合に用いるのが「スレッド」というものです。スレッドとは、プログラムの内部で実行される処理の最小単位、といったものをイメージすればよいでしょうか。――Javaでプログラムがスタートすると、まず1つの「スレッド」が生成され、その中でプログラムが実行されます。これは、 一般に「メインスレッド」と呼ばれます。この中で全ての処理は行なわれ、全処理が終了するとスレッドは終了します。
このメインスレッドで実行している中から、新しいスレッドを作成してスタートすれば、2つのスレッドの中でそれぞれメソッドが実行されるようになります。すなわち、「同時に複数の処理が平行して行える」というわけです。
――イメージ的には、Javaの仮想マシンでは、CPUを使う割り当てを各スレッドごとに割り振って動いている、というようなイメージで考えるとよいでしょう。普通はメインスレッドしかありませんから、CPUはメインスレッドが独占しています。ここでもう1つスレッドが作成されスタートされると、CPUはメインスレッドの処理をしたら次に新スレッドの処理を、次にまたメインスレッドの処理を、次に新スレッドを…というように、スレッド内で実行されているメソッドの処理を少しずつ交代で呼び出しながら行なっていく、というように考えるのです。そう考えれば、スレッドを複数持つことの意味が理解しやすいのではないでしょうか。
このスレッドは、「Thread」というクラスとして用意されています。ですから、スレッドの機能を使いたければこのThreadクラスを継承したクラスを作成すればいいことになります。――が、現実問題として、こういう作り方はしないことも多いようです。なぜなら、スレッドが必要となるのは、何かのクラスを継承したクラス内でのことが多いからです。例えば、AWT利用のプログラムはFrameを継承して作りますね? となると、(継承は常に1つのクラスだけしかできないので)同時にThreadを継承させることはできなくなります。
こうした場合のために、Threadクラスの他に「Runnable」というインターフェイスクラスも用意されています。インターフェイスというのは、例のimplementsで組み込むやつですね。イベントリスナーなんかで利用したやつです。これなら、Frameでも使えますね。
けれど、時には「何かをしながら別の作業を行なう」というようなことが必要となる場合もあります。そのよい例が、アニメーションです。
画面にちょっとしたアニメーションを表示したい、という場合、「アニメーション表示中は他の作業は何もできない」というのではあんまり意味がありません。普通に作業を行えて、それ以外に常にアニメーションが動いている、というようになるのが理想でしょう。となると、「アニメーションを動かす」というメソッドが常に動いていながら、同時にユーザの操作などに対応したイベント処理がきちんと機能していなければいけないことになります。
このような場合に用いるのが「スレッド」というものです。スレッドとは、プログラムの内部で実行される処理の最小単位、といったものをイメージすればよいでしょうか。――Javaでプログラムがスタートすると、まず1つの「スレッド」が生成され、その中でプログラムが実行されます。これは、 一般に「メインスレッド」と呼ばれます。この中で全ての処理は行なわれ、全処理が終了するとスレッドは終了します。
このメインスレッドで実行している中から、新しいスレッドを作成してスタートすれば、2つのスレッドの中でそれぞれメソッドが実行されるようになります。すなわち、「同時に複数の処理が平行して行える」というわけです。
――イメージ的には、Javaの仮想マシンでは、CPUを使う割り当てを各スレッドごとに割り振って動いている、というようなイメージで考えるとよいでしょう。普通はメインスレッドしかありませんから、CPUはメインスレッドが独占しています。ここでもう1つスレッドが作成されスタートされると、CPUはメインスレッドの処理をしたら次に新スレッドの処理を、次にまたメインスレッドの処理を、次に新スレッドを…というように、スレッド内で実行されているメソッドの処理を少しずつ交代で呼び出しながら行なっていく、というように考えるのです。そう考えれば、スレッドを複数持つことの意味が理解しやすいのではないでしょうか。
このスレッドは、「Thread」というクラスとして用意されています。ですから、スレッドの機能を使いたければこのThreadクラスを継承したクラスを作成すればいいことになります。――が、現実問題として、こういう作り方はしないことも多いようです。なぜなら、スレッドが必要となるのは、何かのクラスを継承したクラス内でのことが多いからです。例えば、AWT利用のプログラムはFrameを継承して作りますね? となると、(継承は常に1つのクラスだけしかできないので)同時にThreadを継承させることはできなくなります。
こうした場合のために、Threadクラスの他に「Runnable」というインターフェイスクラスも用意されています。インターフェイスというのは、例のimplementsで組み込むやつですね。イベントリスナーなんかで利用したやつです。これなら、Frameでも使えますね。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
※関連コンテンツ