方法,以空对 Java 线程工厂创建的所有对象的引用



我有一个Java ThreadFactory实现在我的Android应用程序中生成可运行的线程子类对象。 此应用程序要求在某个事件触发之前所有生成的线程都是可寻址的,并且在触发该事件时,生成的线程可以符合垃圾回收的条件(例如,引用计数为 0)。 我在想,为了满足第一个要求,我只需维护线程对象的 ArrayList,并且工作正常。 麻烦来自第二个要求,它导致我提出了一系列关于Java引用计数的问题:

问题 1:仅在 ArrayList 或其他容器中存储对生成线程的引用是否会增加每个线程对象的引用计数? 如果我从不存储它们,而是允许我的工厂创建它们并让它们在没有任何定义的句柄的情况下运行,那么每个线程对象的引用计数是多少,如下所示?

mvThreadSource.newThread(new BackgroundThread(...)).run();

问题 2:下面的代码示例是否对 hTempThread 指向的实际线程对象执行任何操作,而不是递增并立即减少其引用计数?

BackgroundThread hTempThread;
for(int i=0;i<mvThreadsVector.size();i++){
    hTempThread = mvThreadsVector.get(i); //probably increments ref count of thread
    hTempThread = null; //probably just decrements the ref count of thread back to 
                        //previous value
}
问题

3:假设问题 2 的答案为"否",那么存储由 ThreadFactory 实现生成的线程的有效方法是什么,以便它们的引用计数可以按需减少到 0? 删除这些引用涉及的正确语法是什么? 下面的代码示例是否会有效地将所有涉及的对象(mvThreadsVector,tempThreads,mvThreadsVector跟踪的每个线程对象)的引用计数减少到0? clear() 对存储在 arraylist 中的对象的引用计数究竟做了什么,将数组引用设置为 null 对存储在其中的元素的引用计数有什么作用(如果有的话)?

Object[] tempThreads = mvThreadsVector.toArray();
mvThreadsVector.clear(); //possible this line is all I need...
mvThreadsVector = null;
for(int i=0;i<tempThreads.length;i++){
    tempThreads[i] = null;
}
tempThreads = null;
任何

有关上述任何/所有问题的帮助将不胜感激!

  1. 如果你的线程正在运行,在它完成执行之前,它将保留在内存中(或交换),而不是GC。即使 Thread 没有您的代码引用它,而是正在执行代码,它至少在内部有一个引用。

  2. 您甚至不能保证它会增加和减少引用计数。编译器可以通过意识到第一个赋值不起作用(因为它立即被覆盖)并删除它来优化它。

  3. 引用计数将减少,但请记住,引用
  4. 链中可能有循环,其中每个元素将有 1 个引用计数,但整个循环无法访问,正确的 GC 应该意识到这一点并将其删除。

我认为主要问题是你不应该指望线程的引用计数下降到0;只要它们正在运行,你就应该假设它们有引用,所以你还必须有一种确保线程停止执行的方法。

最新更新