ThreadGroup クラスは、Java でスレッド グループを表すために使用されます。スレッド グループはスレッドのコレクションを表し、スレッドとスレッド グループのバッチを管理できます。スレッドは、特定のスレッド グループに割り当てることができます。スレッド グループ内にスレッド オブジェクトが存在することも、スレッド グループが存在することも、グループ内にスレッドが存在することもできます。この組織構造は、ツリーの形式に似ています。図に示すように。
ユーザーが作成したすべてのスレッドは、指定されたスレッド グループに属します。スレッド グループを明示的に指定しない場合、スレッドはデフォルトのスレッド グループ (つまり、メイン スレッド グループ) に属します。デフォルトでは、子スレッドと親スレッドは同じスレッド グループに属します。
また、スレッドが所属するスレッド グループは、スレッドの作成時にのみ指定でき、スレッドの実行中に所属するスレッド グループを変更することはできません。一度指定すると変更できません。
1.安全性
同じスレッド グループ内のスレッドは、互いのデータを変更できます。ただし、異なるスレッド グループにある場合は、「スレッド グループ間」でデータを変更することはできず、データのセキュリティはある程度保証されます。
2. バッチ管理
スレッドまたはスレッド グループ オブジェクトをバッチで管理して、スレッドまたはスレッド グループ オブジェクトを効率的に編成または制御できます。
3. スレッドグループの使用例
1. スレッド関連付けスレッド グループ: 第 1 レベルの関連付け
いわゆる第 1 レベルの関連付けとは、親オブジェクトには子オブジェクトがありますが、孫オブジェクトは作成されないことを意味します。たとえば、スレッド グループを作成し、作成したスレッドをそのグループに割り当てて、これらのスレッドを効果的に管理します。コード例は次のとおりです:
public class ThreadGroupTest { public static void main(String[] args) { ThreadGroup rootThreadGroup = new ThreadGroup("root线程组"); Thread thread0 = new Thread(rootThreadGroup, new MRunnable(), "线程A"); Thread thread1 = new Thread(rootThreadGroup, new MRunnable(), "线程B"); thread0.start(); thread1.start(); } } class MRunnable implements Runnable { @Override public void run() { while (!Thread.currentThread().isInterrupted()) { System.out.println("线程名: " + Thread.currentThread().getName() + ", 所在线程组: " + Thread.currentThread().getThreadGroup().getName()) ; try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } 复制代码
実行結果は次のとおりです。
线程名: 线程A, 所在线程组: root线程组 线程名: 线程B, 所在线程组: root线程组 复制代码
2. スレッド関連付けスレッド グループ: マルチレベル関連付け
いわゆる多レベルの関連付けとは、親オブジェクトに子オブジェクトがあり、子オブジェクト内に孫オブジェクトを作成すると、子孫の効果が得られることを意味します。たとえば、下図の 2 番目の構築方法を使用して、サブスレッド グループを特定のスレッド グループに帰属させ、作成したスレッドをそのサブスレッド グループに帰属させると、スレッド ツリーのような効果が得られます。
コード例は次のとおりです:
public class ThreadGroupTest { public static void main(String[] args) { ThreadGroup rootThreadGroup = new ThreadGroup("root线程组"); Thread thread0 = new Thread(rootThreadGroup, new MRunnable(), "线程A"); Thread thread1 = new Thread(rootThreadGroup, new MRunnable(), "线程B"); thread0.start(); thread1.start(); ThreadGroup threadGroup1 = new ThreadGroup(rootThreadGroup, "子线程组"); Thread thread2 = new Thread(threadGroup1, new MRunnable(), "线程C"); Thread thread3 = new Thread(threadGroup1, new MRunnable(), "线程D"); thread2.start(); thread3.start(); } } class MRunnable implements Runnable { @Override public void run() { while (!Thread.currentThread().isInterrupted()) { System.out.println("线程名: " + Thread.currentThread().getName() + ", 所在线程组: " + Thread.currentThread().getThreadGroup().getName() + ", 父线程组: " + Thread.currentThread().getThreadGroup().getParent().getName()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } 复制代码
実行結果は次のとおりです。
线程名: 线程A, 所在线程组: root线程组, 父线程组: main 线程名: 线程B, 所在线程组: root线程组, 父线程组: main 线程名: 线程C, 所在线程组: 子线程组, 父线程组: root线程组 线程名: 线程D, 所在线程组: 子线程组, 父线程组: root线程组 复制代码
3. グループ内のスレッドの一括管理
当然のことながら、スレッド グループを使用するには、スレッドの一括管理が必要です。たとえば、グループ内のスレッドを一括して中断できます。コード例は次のとおりです:
public class ThreadGroupTest { public static void main(String[] args) { ThreadGroup rootThreadGroup = new ThreadGroup("root线程组"); Thread thread0 = new Thread(rootThreadGroup, new MRunnable(), "线程A"); Thread thread1 = new Thread(rootThreadGroup, new MRunnable(), "线程B"); thread0.start(); thread1.start(); ThreadGroup threadGroup1 = new ThreadGroup(rootThreadGroup, "子线程组"); Thread thread2 = new Thread(threadGroup1, new MRunnable(), "线程C"); Thread thread3 = new Thread(threadGroup1, new MRunnable(), "线程D"); thread2.start(); thread3.start(); rootThreadGroup.interrupt(); System.out.println("批量中断组内线程"); } } class MRunnable implements Runnable { @Override public void run() { while (!Thread.currentThread().isInterrupted()) { System.out.println("线程名: " + Thread.currentThread().getName() + ", 所在线程组: " + Thread.currentThread().getThreadGroup().getName() + ", 父线程组: " + Thread.currentThread().getThreadGroup().getParent().getName()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); break; } } System.out.println(Thread.currentThread().getName() + "执行结束"); } } 复制代码
実行結果は次のとおりです:
线程名: 线程A, 所在线程组: root线程组, 父线程组: main 线程名: 线程B, 所在线程组: root线程组, 父线程组: main 线程名: 线程C, 所在线程组: 子线程组, 父线程组: root线程组 线程名: 线程D, 所在线程组: 子线程组, 父线程组: root线程组 批量中断组内线程 线程A执行结束 线程B执行结束 线程C执行结束 线程D执行结束 复制代码
以上がJava でのスレッド グループの使用例と方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。