代码之家  ›  专栏  ›  技术社区  ›  user1589188

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

  •  3
  • user1589188  · 技术社区  · 8 年前

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

    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秒后线程返回。

    我的问题是:添加到静态线程列表中的线程是否在线程返回后消失?i、 e.我是否希望看到列表中的线程对象在线程返回后的某个点变为null?或者我会无限期地看到线程对象吗?GC在这里起作用吗?

    2 回复  |  直到 8 年前
        1
  •  4
  •   Nathan Hughes    8 年前

    一旦相关的操作系统线程终止,线程对象不会神奇地消失。

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

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

        2
  •  1
  •   dimo414    8 年前

    不,线程不再运行,但 Thread 和其他物体一样,你们抓住的物体也会保留下来。垃圾收集器只能清理没有任何引用的对象,以及 线 实例也不例外。