Previous | Next | Trail Map | Writing Java Programs | スレッドの制御


スレッドグループ

すべての Java スレッドがスレッドグループのメンバになる。 スレッドグループは、ひとつのオブジェクトにマルチスレッドを集め、別々よりもむしろ一度にまとめてそれらのスレッドを操作する機構を提供する。 例えば、 ひとつのメソッド呼び出しで、グループ内のすべてのスレッドを開始したり中断することができる。 Java スレッドグループは java.lang パッケージで ThreadGroup クラスにより実装される。

実行時システムはスレッド構文解釈の間に、スレッドグループにスレッドを入れる。 スレッドを作成する時、実行時システムはいくつかある合理的なデフォルトのグループに新規のスレッドを入れることができる。あるいはスレッドを作成する時に、明示的に新規スレッドのグループを設定することができる。 スレッドは、その作成途中に結合したどんなスレッドグループに対しても永久のメンバになる。スレッドが作成された後に、そのスレッドを新規グループに移動することはできない。

デフォルトのスレッドグループ

Thread クラスは、ThreadGroup 引数を取らないコンストラクタをサポートする。 これらのコンストラクタを使用している新規の Thread を作成する場合、実行時システムは作成したスレッドと同じグループに、自動的に新規のスレッドを配置する(それぞれカレントスレッドグループカレントスレッドとして知られる)。 スレッドがグループのメンバにならなければならず、スレッドを作成する時にスレッドグループを特定しないままでいると、スレッドはどのスレッドグループのメンバになるのか?

Java アプリケーションが最初に開始する時、 Java 実行時システムは「メイン」という ThreadGroup を作成する。 これにより、別に指定されていなければ、作成するすべての新規スレッドが「メイン」スレッドグループのメンバになる。


注釈: アプレット内でスレッドを作成する場合、新規スレッドのグループは「メイン」以外になることがある。これは、アプレットが実行中であるブラウザあるいはビューワに依存する。 アプレット内でデフォルトのスレッドグループにスレッドを作成する情報の詳細については、アプレットでのスレッド(in the Writing Applets trail)を参照のこと。


多くの Java プログラマは、完全にスレッドグループを無視して、実行時システムがスレッドグループに関する詳細のすべてを処理することを許している。 しかし、プログラムがグループとして操作される多くのスレッドを作成する場合、あるいは注文による SecurityManager を実装している場合は、スレッドグループをもっと制御したいだろう。詳細を知るために読み続けよう!

グループ内での明示的なスレッドの作成

前に述べた通り、スレッドは、その作成時に結合するどんなスレッドグループに対しても、永久のメンバになる。スレッドを作成した後は、スレッドを新規グループに移動することはできない。 したがって、デフォルト以外のスレッドグループに新規のスレッドを入れたければ、スレッドを作成する時に、明示的にスレッドグループを指定しなくてはならない。 Thread クラスには、新規スレッドのグループを設定させる 3つのコンストラクタがある。

public Thread(ThreadGroup group, Runnable target)
public Thread(ThreadGroup group, String name)
public Thread(ThreadGroup group, Runnable target, String name)

これらコンストラクタのそれぞれは、新規スレッドを作成し、Runnable と String パラメータに基づいて初期化し、新規スレッドを指定されたグループのメンバにする。 例えば、次のコード例は myThreadGroup と指定された ThreadGroup を作成して、次にそのグループで myThread と呼ばれるスレッドを作成する。

ThreadGroup myThreadGroup = new ThreadGroup("My Group of Threads");
Thread myThread = new Thread(myThreadGroup, "a thread for my group");

Thread コンストラクタに渡される ThreadGroup は、必ずしも作成するグループである必要はない。 Java 実行時システムにより作成されるグループ、あるいはアプレットが実行しているアプリケーションにより作成されるグループの可能性がある。

スレッドのグループの確認

スレッドが何のグループに入っているか見つけるために、 getThreadGroup() メソッドを呼び出すことができる。

theGroup = myThread.getThreadGroup();

ThreadGroup クラス

スレッドの ThreadGroup が分かれば、他にどんなスレッドがそのグループに属しているかなどの情報を、グループに質問することができる。 ひとつのメソッド呼び出しにより、そのグループ内のスレッドも変更(一時停止、再開、あるいは停止)することができる。

参照

java.lang.ThreadGroup


Previous | Next | Trail Map | Writing Java Programs | スレッドの制御