gpt4 book ai didi

java - 使用静态列表保留Java中的所有线程

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:02:41 25 4
gpt4 key购买 nike

您好,我想使用静态列表来保留所有正在运行的线程,例如:

public class MyClass {
public static final List<Thread> threads = new ArrayList<>();
public static void main(String[] args) throws InterruptedException {
new Thread(() -> {
MyClass.threads.add(Thread.currentThread());
try {
Thread.sleep(2000);
} catch (Exception e) {
}
}).start();
for (int i = 0; i < 10; i++) {
if (!threads.isEmpty()) {
Thread t = threads.get(0);
System.out.println(t.isAlive());
}
Thread.sleep(1000);
}
}
}

上面的代码会打印出

true
true
false
false
...

这符合预期,因为线程会在 2 秒后返回。

我的问题是:添加到静态线程列表的线程在线程返回后是否会消失?即我是否希望在线程返回后的某个时刻看到列表中的线程对象变为空?或者我会无限期地看到线程对象吗? GC 在这里发挥作用吗?

最佳答案

Thread 对象不会在关联的操作系统线程终止后神奇地消失。

一旦线程终止,它就不能作为 GC 根,但只要有其他东西保持对它的引用,比如你的列表,它就会一直存在。

线程是否停止或中断或其他什么都不重要。 java.lang.Thread 是一个引用系统资源的对象,即实际线程,只要该线程还活着,但一旦线程终止,它就不会做任何事情来销毁该对象。 Just isAlive 返回 false 并且您不能再成功调用 start 了。

很难想象像您提议的那样保留线程列表会有什么好处。

关于java - 使用静态列表保留Java中的所有线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46701865/

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