小编Cal*_*lum的帖子

在ReferenceQueue中的PhantomReference是否会阻止PhantomReference进行GC?

我正在使用LWJGL库,不幸的是,每当我的场景图中的节点需要死时,我都需要释放纹理/ vbo缓冲区,我甚至无法使用finalize()方法来执行此操作,因为我无法保证它将在opengl libs期望的同一个线程中执行.

所以我正在使用PhantomReferences.在我的场景图节点中,我将它放在构造函数中:

phantomReference = new ScenePhantomReference(this, Game.phantomReferenceQueue);
Game.phantomReferenceList.add(phantomReference);
Run Code Online (Sandbox Code Playgroud)

正如您在第二行中看到的,我已将phantomReference添加到主类中的列表中.我的逻辑是,当节点被解除引用时,phantomReference将不会被垃圾收集,因为在主类中仍然存在引用.

将它添加到需要的列表中吗?或者它是否会从GC中幸免(可能Game.phantomReferenceQueue会保留对它的引用?).

这个很难测试,我可以删除列表,但GC可能只是在phantomReference之前处理正在观察的对象,并使它看起来像列表是多余的,当它真的没有.我很偏执,任何不同的VM实现或版本都可能决定反过来这样做.

java

11
推荐指数
1
解决办法
427
查看次数

如何调用泛型类型对象的方法?

以下代码给出了错误:

SceneNode.java:17: cannot find symbol
symbol  : method execute() location:
class java.lang.Object
                operation.execute();
                         ^ 1 error
Run Code Online (Sandbox Code Playgroud)

码:

import java.util.LinkedList;
import java.util.Iterator;

public class SceneNode<T>{
    T operation;    
    public SceneNode() {
    }   
    public SceneNode(T operation) {
        this.operation = operation;
    }
    public void setOperation(T operation) {
        this.operation = operation;
    }
    public void doOperation() {
        operation.execute();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个简单的场景图的缩减(为了您的可读性).节点可以是模型,转换,开关等,所以我创建了一个变量,称为operation类型由T类变量定义.这样我就可以传递一个Transformation/ Model/ Switch对象(有一个execute方法)并像这样传递它:

SceneNode<Transformation> = new SceneNode<Transformation>(myTransformation);
Run Code Online (Sandbox Code Playgroud)

我很确定SceneNode为所有各种类型的节点都有一个基类和子类是一个更好的主意(我正在尝试泛型,最近才了解它们).为什么这不起作用?我必须遗漏一些关于泛型的基本知识.

java generics

10
推荐指数
3
解决办法
2万
查看次数

标签 统计

java ×2

generics ×1