gpt4 book ai didi

复制 Thread 数组

转载 作者:知者 更新时间:2024-03-13 03:53:08 27 4
gpt4 key购买 nike

一 点睛

ThreadGroup 复制线程的两个方法。
public int enumerate(Thread list[]) // 会将 ThreadGroup 中的 active 线程全部复制到 Thread 数组中,它等价于 enumerate(list,true)

public int enumerate(Thread list[], boolean recurse) // 会将 ThreadGroup 中的 active 线程全部复制到 Thread 数组中,如果 recurse = true,则该方法会将所有子 group 中的 active 线程都递归到 Thread 数组中

二 源码分析

上面两个方法都会调用下面这个方法。

private int enumerate(Thread list[], int n, boolean recurse) {
    int ngroupsSnapshot = 0;
    ThreadGroup[] groupsSnapshot = null;
    synchronized (this) {
        if (destroyed) {
            return 0;
        }
        int nt = nthreads;
        if (nt > list.length - n) {
            nt = list.length - n;
        }
        for (int i = 0; i < nt; i++) {
            if (threads[i].isAlive()) {
                list[n++] = threads[i];
            }
        }
        if (recurse) {
            ngroupsSnapshot = ngroups;
            if (groups != null) {
                groupsSnapshot = Arrays.copyOf(groups, ngroupsSnapshot);
            } else {
                groupsSnapshot = null;
            }
        }
    }
    if (recurse) {
        for (int i = 0 ; i < ngroupsSnapshot ; i++) {
            n = groupsSnapshot[i].enumerate(list, n, true);
        }
    }
    return n;
}

三 实战

1 代码

package concurrent;

import java.util.concurrent.TimeUnit;

public class Enumerate {
    public static void main(String[] args) {
        // 创建一个线程组
        ThreadGroup myGroup = new ThreadGroup("MyGroup");
        // 创建线程传入 myGroup
        Thread thread = new Thread(myGroup, () -> {
            while (true) {
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "MyThread");
        thread.start();

        try {
            TimeUnit.MILLISECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        ThreadGroup mainGroup = Thread.currentThread().getThreadGroup();

        Thread[] list = new Thread[mainGroup.activeCount()];
        int recurseSize = mainGroup.enumerate(list);
        System.out.println(recurseSize);

        recurseSize = mainGroup.enumerate(list, false);
        System.out.println(recurseSize);
    }
}

2 测试

2

1

3 说明 

首先定义一个 ThreadGroup,并且将该 group 加入到 main group 中,然后定义一个线程 thread 并其加入 myGroup 中,最后分别调用 enumerate 的递归和非递归方法。

上面的代码运行之后,最后一个输出会比第一个少1,那是因为代码中将递归 recurse 设置为 false,myGroup 中的线程将不会包含在内。

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com