java - 将 Java ThreadFactory 创建的对象的所有引用置为 null 的方法

标签 java multithreading runnable reference-counting abstract-factory

我有一个 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() 对存储在数组列表中的对象的引用计数到底有何作用,以及将数组引用设置为 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。即使线程没有您的代码引用它但正在执行代码,它至少在内部有一个引用。

  2. 您甚至无法保证它会递增和递减引用计数。编译器可以通过意识到第一个赋值没有效果(因为它立即被覆盖)并删除它来优化它。

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

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

关于java - 将 Java ThreadFactory 创建的对象的所有引用置为 null 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14591824/

相关文章:

java - java try catch block 的特殊语法

java - 防止安装文件在记事本中作为文本打开

java - 如何在android中方向改变时连续播放音频

c++ - 创建非静态成员函数的线程?

android - 在 Android 中为 "networking"使用另一个线程

java - 如何在 Java 中将字符串转换为可运行代码

java - 找出数字中位数并打印出来的更快方法?

java - 似乎我的接收方法没有在 java 中的多播套接字上获取数据包

java - 如何使用多线程生成数据?

java - 哪个方法用于运行线程?