アプレットの概説 |
注: このページは、読者がスレッドについて理解していることを前提としている。スレッ ドがよくわかっていない場合は、このページを読み進む前にスレッドとは何かを読むとよい。すべてのアプレットはマルチスレッドで実行することができる。 Applet のドローイングメソッド (
paint()
とupdate()
) は常に、AWT のドローイングおよびイベント処理のスレッドから呼び出される。主要なマイルストンメソッドであるinit()
、start()
、stop()
、およびdestroy()
メソッドが呼び出されるスレッドは、アプレットを実行しているアプリケーションによって異なるが、アプリケーションが AWT のドローイングおよびイベント処理のスレッドからこれらのメソッドを呼び出すことはない。Solaris 向けの、Netscape Navigator 2.0 のような多くのブラウザは、ページの各 アプレットごとにスレッドを割り当て、アプレットの主要なマイルストンメソッドへ のすべての呼び出しに対してそのスレッドを使用する。ブラウザの中には、各アプレ ットごとにスレッドグループを割り当て、特定のアプレットに属するすべてのスレッ ドを簡単に終了させられるようにしているものもある。いずれにしても、アプレット の主要なマイルストンメソッドのどれかが作成するスレッドはすべて、同じスレッド グループに属することが保証されている。
以下に 2 つの PrintThread アプレットを示す。 PrintThread は、
init()
、start()
、stop()
、destroy()
、paint()
、update()
が呼び出されるスレッドとスレッドグループをプリントする SimpleApplet に変更を加えたバージョンである。 (コードも参照できる。) PrintThread は、update()
とpaint()
がどのように呼び出されるか をわかりやすくするために、本来は必要でないrepaint()
を何度か 呼び出すようになっている。アンロード時に呼び出されるdestroy()
のようなメソッドの出力を確認するには、通常どおり、標準出力を見る必要がある。
ところで、なぜアプレットは独自のスレッドを作成し使用する必要があるのだろうか ?
init()
メソッドの中で、たとえばイメージのロードのような初期化に時間のかかる処理を実行するアプレットを考えてみよう。init()
を 起動するスレッドは、init()
が戻るまで、他に何も行うことができない。このことは一部のブラウザでは、アプレットがその初期化を終了するまでアプレ ットやその他すべての表示を行えないということになる。したがって、もしそのアプ レットがページの先頭にあれば、アプレットがその初期化を終了するまで、そのページには何も表示されないことになってしまう。アプレットごとに別個のスレッドを作成するブラウザであっても、時間のかかるタスクをアプレットの作成するスレッドの中に配置するのは意味のあることである。それにより、アプレットが時間のかかるタスクの完了を待つ間、他のタスクを実行できる。
経験から得た方法: アプレットが時間のかかるタスクを実行する場合は、そのタスクを実行するためのスレッドを独自に作成して使用するべきである。
アプレットが実行するタスクのうち時間のかかるタスクは、一度だけ実行するものと、繰り返し実行するものの 2種類に分けられる。次のページで両方の例を紹介する。
アプレットの概説 |