如何处置未使用的java UI对象

如何处置未使用的java UI对象,java,swing,Java,Swing,我有一个swing应用程序,它“生成”了许多类对象——让我们称它们为“参与者”。在程序运行期间,这些对象会从UI的角度被销毁,但我不确定如何从应用程序的角度处理对象的处理 为了更好地描述这种情况,在游戏板上有类actor的实例。从游戏的角度来看,当其中一个片段在逻辑上被销毁时,它们会从游戏板上消失,但从应用程序的角度来看,对象的执行代码仍然会在重新调度期间触发。过于简化的示例代码: package ext; public abstract class Actor implements Compa

我有一个swing应用程序,它“生成”了许多类对象——让我们称它们为“参与者”。在程序运行期间,这些对象会从UI的角度被销毁,但我不确定如何从应用程序的角度处理对象的处理

为了更好地描述这种情况,在游戏板上有类actor的实例。从游戏的角度来看,当其中一个片段在逻辑上被销毁时,它们会从游戏板上消失,但从应用程序的角度来看,对象的执行代码仍然会在重新调度期间触发。过于简化的示例代码:

package ext;
public abstract class Actor implements Comparable<Actor> {
...
    public void execute();{
       //execute code goes here
    }
}

package ext;
public class EXT extends JFrame implements ActionListener {
        myactor = new Actor();
}
package-ext;
公共抽象类参与者实现了可比较的{
...
公共无效执行(){
//执行代码在这里
}
}
包分机;
公共类EXT扩展JFrame实现ActionListener{
myactor=newactor();
}

因此,一个新的演员在30秒内就诞生了,而且在同一时间板上最多可以有40个演员。。。当一个actor在逻辑上被消除时,如何阻止actor.execute例程每次为该actor实例触发?或者我必须为参与者设置一个位标志来表示它已被销毁,并在actor.execute例程中使用if来检查每次触发的位标志吗?

您有一些选择,您可以有一个参与者池,您可以从中进行绘制,将他们放入“活动”队列,完成后,这些参与者将被“执行”,未使用的参与者将被放回池中。这意味着您可以减少每次创建对象的开销。您可以对池设置一个上限/下限,当池“满”时,您只需丢弃actor引用(删除对它的所有引用),并允许GC接管。或者,您可以简单地执行最后一个阶段,删除对参与者的任何引用,并让GC处理它。最终,答案将取决于参与者正在做什么(是否可以重复使用)以及如何“执行”。假设您有某种队列,循环并“执行”每个参与者(或类似的内容),如果是这样,那么从该队列中删除参与者将阻止其被执行。丢弃参与者引用的正确方法是什么?myactor=null似乎并没有实际删除该实例,execute()例程似乎仍在定期为该actor实例触发…然后仍有东西在引用该对象。一个没有引用它的对象,如果它也引用了没有被任何其他对象引用的对象,就有资格使用GC。您必须确保对象本身没有引用任何可能使其保持活动状态的内容,并且它们没有直接或间接地强引用itOK很好,这听起来是可行的。让我看看对象的引用设置为null时的状态。如果按可能的顺序排序,我会回来并在这里添加答案。您有一些选择,您可以从中提取一个参与者池,将他们放入“活动”队列,这些参与者将被“执行”,完成后,未使用的参与者将被放回该池。这意味着您可以减少每次创建对象的开销。您可以对池设置一个上限/下限,当池“满”时,您只需丢弃actor引用(删除对它的所有引用),并允许GC接管。或者,您可以简单地执行最后一个阶段,删除对参与者的任何引用,并让GC处理它。最终,答案将取决于参与者正在做什么(是否可以重复使用)以及如何“执行”。假设您有某种队列,循环并“执行”每个参与者(或类似的内容),如果是这样,那么从该队列中删除参与者将阻止其被执行。丢弃参与者引用的正确方法是什么?myactor=null似乎并没有实际删除该实例,execute()例程似乎仍在定期为该actor实例触发…然后仍有东西在引用该对象。一个没有引用它的对象,如果它也引用了没有被任何其他对象引用的对象,就有资格使用GC。您必须确保对象本身没有引用任何可能使其保持活动状态的内容,并且它们没有直接或间接地强引用itOK很好,这听起来是可行的。让我看看对象的引用设置为null时的状态。如果答案按可能的顺序排列,我会回来在这里添加答案。