スレッドグループの一般的な方法
1.現在のスレッドグループの名前を取得します
// 或者当前运行线程所属的线程组 Thread.currentThread().getThreadGroup().getName();
2.スレッドグループをコピーします
// 复制一个线程数组到一个线程组 Thread[] threads = new Thread[2]; ThreadGroup threadGroup = new ThreadGroup("copyGroup"); threadGroup.enumerate(threads);
3.スレッドグループの統一された例外処理
public class ThreadGroupDemo{ public static void main(String[] args){ ThreadGroup threadGroup1 = new ThreadGroup("group1"){ // 继承ThreadGroup并重新定义一下方法 // 在【线程成员】抛出unchecked exception // 会执行次方法 @Override public void uncaughtException(Thread t, Throwable e) { super.uncaughtException(t, e); System.out.println(t.getName() + ": " + e.getMessage()); } }; // 这个线程是threadGroup1的一员 Thread thread1 = new Thread(threadGroup1, new Runnable(){ public void run(){ // 模拟抛出异常 throw new RuntimeException("测试异常"); } }); thread1.start(); } }
スレッドグループのデータ構造
スレッドグループには、スレッドだけでなく、他のスレッドグループを含めることもできます。
public class ThreadGroup implements Thread.UncaughtExceptionHandler {
private final ThreadGroup parent; // 父亲ThreadGroup
String name; // ThreadGroup的名称
int maxPriority; // 线程最大优先级
boolean destroyed; // 是否被销毁
boolean daemon; // 是否守护线程
boolean vmAllowSuspension; // 是否可以中断
int nUnstartedThreads = 0; // 还未启动的线程
int nthreads; // ThreadGroup中线程数目
Thread threads[]; // ThreadGroup中的线程
int ngroups; // 线程组数目
ThreadGroup groups[]; // 线程组数组
}
// 私有构造函数
private ThreadGroup() { // called from C code
this.name = "system";
this.maxPriority = Thread.MAX_PRIORITY;
this.parent = null;
}
public ThreadGroup(String name) {
//
this(Thread.currentThread().getThreadGroup(), name);
}
public ThreadGroup(ThreadGroup parent, String name) {
this(checkParentAccess(parent), parent, name);
}
// 私有构造函数,主要的构造函数
private ThreadGroup(Void unused, ThreadGroup parent, String name) {
this.name = name;
this.maxPriority = parent.maxPriority;
this.daemon = parent.daemon;
this.vmAllowSuspension = parent.vmAllowSuspension;
this.parent = parent;
parent.add(this);
}
// 检查parent
private static Void checkParentAccess(ThreadGroup parent) {
parent.checkAccess();
return null;
}
// 判断当前运行的线程是否具有修改线程组的权限
public final void checkAccess() {
// Java的安全管理器,它允许应用程序在执行一个可能不安全或敏感的操作前确定该操作时什么
// 以及是否是在允许执行该操作的安全上下文中执行它。
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkAccess(this);
}
}
要約すると、スレッドグループはツリー構造であり、各スレッドグループは複数のスレッドまたはスレッドグループを持つことができます。スレッドグループは、スレッドの優先順位を制御し、スレッドのアクセス許可を確認する際に統一された役割を果たすことができます。
スレッドグループとスレッドプールの違い
スレッドグループ[スレッドグループの存在の意味、最初の理由は安全性です]
Javaによって作成されたスレッドは、デフォルトでシステムスレッドグループに属し、同じスレッドグループのスレッドは互いのデータを変更できます。異なるスレッドグループは、データのセキュリティを確保するためにデータ「クロススレッドグループ」を変更できません。
スレッドプール[効率]
スレッドの作成と終了には一定のシステム時間が必要です。スレッドを継続的に作成および削除すると、多くの時間が無駄になります。したがって、スレッドを作成し、タスクの実行後に終了しないようにしますが、スレッドをスリープ状態にし、必要に応じてウェイクアップすると、一定の時間を節約できます。管理にスレッドプールを使用する場合は、効率を確保してください。
共通点:
- 特定の数のスレッドを管理します。
- スリープ、ウェイクアップ、終了、作成、割り込みなど、すべてのスレッドを制御できます。