広告

Java : ThreadGroup - API使用例

ThreadGroup (Java SE 21 & JDK 21) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様書のおともにどうぞ。


概要

スレッド・グループは、スレッドの集合を表します。 さらに、スレッド・グループにはほかのスレッド・グループが含まれることもあります。 スレッド・グループはツリーを形成し、最初のスレッド・グループを除いてその中で親を持ちます。

クラス構成

ThreadGroup クラスを使うと、複数の Thread をグループとしてまとめることができます。

final var group = new ThreadGroup("group-A");
System.out.println("group : " + group);

final Runnable task = () -> {
    try {
        final var current = Thread.currentThread();
        System.out.println("  run : " + current);

        TimeUnit.SECONDS.sleep(1);

    } catch (InterruptedException e) {
        System.out.println("InterruptedException!");
    }
};

final var threadA = new Thread(group, task, "name-A");
final var threadB = new Thread(group, task, "name-B");

System.out.println("-- start --");

threadA.start();
threadB.start();

System.out.println("activeCount = " + group.activeCount());

threadA.join();
threadB.join();

System.out.println("-- join --");
System.out.println("activeCount = " + group.activeCount());


// 結果
// ↓
//group : java.lang.ThreadGroup[name=group-A,maxpri=10]
//-- start --
//  run : Thread[#32,name-A,5,group-A]
//  run : Thread[#33,name-B,5,group-A]
//activeCount = 2
//-- join --
//activeCount = 0

コンストラクタ

ThreadGroup (String name)

新しいスレッド・グループを構築します。

final var group1 = new ThreadGroup("abc");
System.out.println(group1.getName()); // abc

final var group2 = new ThreadGroup("XYZ");
System.out.println(group2.getName()); // XYZ

ThreadGroup (ThreadGroup parent, String name)

新しいスレッド・グループを作成します。

final var parent = new ThreadGroup("parent");
System.out.println(parent.getName()); // parent

final var childA = new ThreadGroup(parent, "child-A");
final var childB = new ThreadGroup(parent, "child-B");

System.out.println(childA.getName()); // child-A
System.out.println(childB.getName()); // child-B

System.out.println(parent.getParent().getName()); // main
System.out.println(childA.getParent().getName()); // parent
System.out.println(childB.getParent().getName()); // parent

メソッド

int activeCount ()

このスレッド・グループおよびそのサブグループ内のliveプラットフォーム・スレッド数の見積りを返します。

final Runnable task = () -> {
    try {
        TimeUnit.SECONDS.sleep(1);
    } catch (InterruptedException e) {
        System.out.println("InterruptedException!");
    }
};

final var parent = new ThreadGroup("parent");
final var p1 = new Thread(parent, task);
final var p2 = new Thread(parent, task);

final var child = new ThreadGroup(parent, "child");
final var c1 = new Thread(child, task);
final var c2 = new Thread(child, task);

System.out.println(parent.activeCount()); // 0
System.out.println(child.activeCount()); // 0

p1.start();
p2.start();
c1.start();
c2.start();

System.out.println(parent.activeCount()); // 4
System.out.println(child.activeCount()); // 2

p1.join();
p2.join();
c1.join();
c2.join();

System.out.println(parent.activeCount()); // 0
System.out.println(child.activeCount()); // 0

int activeGroupCount ()

このスレッド・グループおよびそのサブグループ内のグループ数の見積りを返します。

final var parent = new ThreadGroup("parent");
final var childA = new ThreadGroup(parent, "child-A");
final var childB = new ThreadGroup(parent, "child-B");

final var childChildA1 = new ThreadGroup(childA, "child-child-A1");
final var childChildA2 = new ThreadGroup(childA, "child-child-A2");

final var childChildB1 = new ThreadGroup(childB, "child-child-B1");

System.out.println(parent.activeGroupCount()); // 5
System.out.println(childA.activeGroupCount()); // 2
System.out.println(childB.activeGroupCount()); // 1

System.out.println(childChildA1.activeGroupCount()); // 0
System.out.println(childChildA2.activeGroupCount()); // 0
System.out.println(childChildB1.activeGroupCount()); // 0

final void checkAccess ()

削除予定のため非推奨: このAPI要素は、将来のバージョンで削除される可能性があります。 このメソッドは、非推奨であり、今後のリリースで削除される可能性があります。「セキュリティ・マネージャ」と組み合わせて使用すると便利です。

非推奨です。

final void destroy ()

削除予定のため非推奨: このAPI要素は、将来のバージョンで削除される可能性があります。 このメソッドは元々、空のスレッド・グループを破棄するように指定されました。

非推奨です。

int enumerate (Thread[] list)

このスレッド・グループおよびそのサブグループ内のすべてのliveプラットフォーム・スレッドに指定された配列にコピーします。

final Runnable task = () -> {
    try {
        TimeUnit.SECONDS.sleep(1);
    } catch (InterruptedException e) {
        System.out.println("InterruptedException!");
    }
};

final var parent = new ThreadGroup("parent");
final var p1 = new Thread(parent, task, "p1");
final var p2 = new Thread(parent, task, "p2");

final var child = new ThreadGroup(parent, "child");
final var c1 = new Thread(child, task, "c1");
final var c2 = new Thread(child, task, "c2");

p1.start();
p2.start();
c1.start();
c2.start();

final var list = new Thread[parent.activeCount()];
final var count = parent.enumerate(list);
System.out.println("count = " + count);

System.out.println("-- list --");
for (int i = 0; i < count; i++) {
    System.out.println(list[i].getName());
}

p1.join();
p2.join();
c1.join();
c2.join();

// 結果
// ↓
//count = 4
//-- list --
//p1
//p2
//c1
//c2

int enumerate (Thread[] list, boolean recurse)

このスレッド・グループ内のすべてのliveプラットフォーム・スレッドに指定された配列にコピーします。

recurse = true は enumerate(Thread[] list) と同等です。
そちらのAPI使用例もご参照ください。

final Runnable task = () -> {
    try {
        TimeUnit.SECONDS.sleep(1);
    } catch (InterruptedException e) {
        System.out.println("InterruptedException!");
    }
};

final var parent = new ThreadGroup("parent");
final var p1 = new Thread(parent, task, "p1");
final var p2 = new Thread(parent, task, "p2");

final var child = new ThreadGroup(parent, "child");
final var c1 = new Thread(child, task, "c1");
final var c2 = new Thread(child, task, "c2");

p1.start();
p2.start();
c1.start();
c2.start();

final var list = new Thread[parent.activeCount()];
final var count = parent.enumerate(list, false);
System.out.println("count = " + count);

System.out.println("-- list --");
for (int i = 0; i < count; i++) {
    System.out.println(list[i].getName());
}

p1.join();
p2.join();
c1.join();
c2.join();

// 結果
// ↓
//count = 2
//-- list --
//p1
//p2

int enumerate (ThreadGroup[] list)

指定された配列参照を、このスレッド・グループおよびそのサブグループ内のすべてのサブグループにコピーします。

final var parent = new ThreadGroup("parent");
final var childA = new ThreadGroup(parent, "child-A");
final var childB = new ThreadGroup(parent, "child-B");

new ThreadGroup(childA, "child-child-A1");
new ThreadGroup(childA, "child-child-A2");

new ThreadGroup(childB, "child-child-B1");

final var list = new ThreadGroup[parent.activeGroupCount()];
final var count = parent.enumerate(list);
System.out.println("count = " + count);

System.out.println("-- list --");
for (int i = 0; i < count; i++) {
    System.out.println(list[i].getName());
}

// 結果
// ↓
//count = 5
//-- list --
//child-A
//child-child-A1
//child-child-A2
//child-B
//child-child-B1

int enumerate (ThreadGroup[] list, boolean recurse)

指定された配列参照をこのスレッド・グループ内のすべてのサブグループにコピーします。

recurse = true は enumerate(ThreadGroup[] list) と同等です。
そちらのAPI使用例もご参照ください。

final var parent = new ThreadGroup("parent");
final var childA = new ThreadGroup(parent, "child-A");
final var childB = new ThreadGroup(parent, "child-B");

new ThreadGroup(childA, "child-child-A1");
new ThreadGroup(childA, "child-child-A2");

new ThreadGroup(childB, "child-child-B1");

final var list = new ThreadGroup[parent.activeGroupCount()];
final var count = parent.enumerate(list, false);
System.out.println("count = " + count);

System.out.println("-- list --");
for (int i = 0; i < count; i++) {
    System.out.println(list[i].getName());
}

// 結果
// ↓
//count = 2
//-- list --
//child-A
//child-B

final int getMaxPriority ()

このスレッド・グループの最高優先順位を返します。

final var group = new ThreadGroup("group");
System.out.println(group.getMaxPriority()); // 10

final var thread = new Thread(group, () -> {
}, "thread");
System.out.println(thread.getPriority()); // 5
final var group = new ThreadGroup("group");

group.setMaxPriority(Thread.MIN_PRIORITY);
System.out.println(group.getMaxPriority()); // 1

final var thread = new Thread(group, () -> {
}, "thread");
System.out.println(thread.getPriority()); // 1

final String getName ()

このスレッド・グループの名前を返します。

このメソッドの使用例は、ThreadGroup(String name) にまとめて記載しました。
そちらのAPI使用例をご参照ください。

final ThreadGroup getParent ()

このスレッド・グループの親を返します。

このメソッドの使用例は、ThreadGroup(ThreadGroup parent, String name) にまとめて記載しました。
そちらのAPI使用例をご参照ください。

final void interrupt ()

このスレッド・グループおよびそのサブグループ内のすべてのliveプラットフォーム・スレッドを中断します。

final Runnable task = () -> {
    try {
        System.out.println("task : start");
        TimeUnit.SECONDS.sleep(1);
    } catch (InterruptedException e) {
        System.out.println("  InterruptedException!");
    }
};

final var group = new ThreadGroup("group");
final var t1 = new Thread(group, task, "t1");
final var t2 = new Thread(group, task, "t2");

System.out.println("-- start --");

t1.start();
TimeUnit.MILLISECONDS.sleep(100);

t2.start();
TimeUnit.MILLISECONDS.sleep(100);

group.interrupt();

t1.join();
t2.join();

System.out.println("-- join --");

// 結果
// ↓
//-- start --
//task : start
//task : start
//  InterruptedException!
//  InterruptedException!
//-- join --

final boolean isDaemon ()

削除予定のため非推奨: このAPI要素は、将来のバージョンで削除される可能性があります。 このメソッドは元々、スレッド・グループが最後のスレッドが終了したときに自動的に破棄される「デーモン・スレッド・グループ」であるかどうかを示していました。

非推奨です。

boolean isDestroyed ()

削除予定のため非推奨: このAPI要素は、将来のバージョンで削除される可能性があります。 このメソッドはもともと、スレッド・グループが破棄されるかどうかを示していました。

非推奨です。

void list ()

このスレッド・グループについての情報を標準出力に出力します。

final var group1 = new ThreadGroup("abc");
group1.list(); // java.lang.ThreadGroup[name=abc,maxpri=10]

final var group2 = new ThreadGroup("XYZ");
group2.setMaxPriority(Thread.MIN_PRIORITY);
group2.list(); // java.lang.ThreadGroup[name=XYZ,maxpri=1]

final boolean parentOf (ThreadGroup g)

このスレッド・グループがスレッドグループ引数であるか、あるいはその祖先スレッド・グループの内の1つであるかどうかを判定します。

final var parent = new ThreadGroup("parent");
final var child = new ThreadGroup(parent, "child");
final var childChild = new ThreadGroup(child, "child-child");

System.out.println(parent.parentOf(parent)); // true
System.out.println(parent.parentOf(child)); // true
System.out.println(parent.parentOf(childChild)); // true

System.out.println(child.parentOf(parent)); // false
System.out.println(child.parentOf(child)); // true
System.out.println(child.parentOf(childChild)); // true

System.out.println(childChild.parentOf(parent)); // false
System.out.println(childChild.parentOf(child)); // false
System.out.println(childChild.parentOf(childChild)); // true

final void resume ()

削除予定のため非推奨: このAPI要素は、将来のバージョンで削除される可能性があります。 このメソッドは元々、スレッド・グループ内のすべてのスレッドを再開するように指定されました。

非推奨です。

final void setDaemon (boolean daemon)

削除予定のため非推奨: このAPI要素は、将来のバージョンで削除される可能性があります。 このメソッドは、スレッド・グループが、最後のスレッドが終了したときに自動的に破棄される「デーモン・スレッド・グループ」かどうかを構成していました。

非推奨です。

final void setMaxPriority (int pri)

グループの最高優先順位を設定します。

このメソッドの使用例は、getMaxPriority() にまとめて記載しました。
そちらのAPI使用例をご参照ください。

final void stop ()

削除予定のため非推奨: このAPI要素は、将来のバージョンで削除される可能性があります。 このメソッドは元々、スレッド・グループ内のすべてのスレッドを停止するように指定されました。

非推奨です。

final void suspend ()

削除予定のため非推奨: このAPI要素は、将来のバージョンで削除される可能性があります。 このメソッドは元々、スレッド・グループ内のすべてのスレッドを一時停止するように指定されました。

非推奨です。

String toString ()

このスレッド・グループの文字列表現を返します。

final var group1 = new ThreadGroup("abc");
final var str1 = group1.toString();
System.out.println(str1); // java.lang.ThreadGroup[name=abc,maxpri=10]

final var group2 = new ThreadGroup("XYZ");
group2.setMaxPriority(Thread.MIN_PRIORITY);

final var str2 = group2.toString();
System.out.println(str2); // java.lang.ThreadGroup[name=XYZ,maxpri=1]

void uncaughtException (Thread t, Throwable e)

このスレッド・グループ内のスレッドが、キャッチされていない例外のために停止し、スレッドに固有のThread.UncaughtExceptionHandlerが備えられていないときに、Java仮想マシンによって呼び出されます。

final var group = new ThreadGroup("group") {
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        super.uncaughtException(t, e);

        System.out.println("uncaughtException");
        System.out.println("  t = " + t.getName());
        System.out.println("  e = " + e);
    }
};

final var threadA = new Thread(group, () -> {
    throw new IllegalStateException("Error!");
}, "thread-A");

System.out.println("-- start --");
threadA.start();

threadA.join();
System.out.println("-- join --");
System.out.println("activeCount : " + group.activeCount());

// 結果
// ↓
//-- start --
//uncaughtException
//  t = thread-A
//  e = java.lang.IllegalStateException: Error!
//-- join --
//activeCount : 0

関連記事

ページの先頭へ