java队列没有释放

时间:2014-04-28 00:44:56

标签: java memory-management methods queue

我调用下面的方法,每次'finishedRacers'都有相同的对象。我尝试使用.clear(),并使用 new 为它分配新内存,但每次重新输入方法时,它都会返回相同的对象。关于为什么在我尝试重新分配并清除它之后,为什么finishedRacers仍然持有对象的想法?

@Override
public Queue<Racer> stopThenResetEvent(){
    Queue<Racer> q = new LinkedList<Racer>();
    while(!finishedRacers.isEmpty()) q.add(finishedRacers.poll());
    return q;
}

不确定它是否重要,但该类包含继承,并且在扩展的抽象类中声明finishedRacers队列。抽象类继承自接口。

编辑:

finishedRacers的声明方式与q相同,它是一个使用LinkedList实现的Queue。队列在此类扩展的抽象类中声明。它是IEvent(接口) - &gt;事件(摘要,声明队列) - &gt; GroupEvent(调用此重写方法的类)。我将此方法称为清除finishedRacers队列并返回其中保存的对象。

当我多次调用它时,不改变事件的状态(添加新的赛车手,开始比赛等),但只是再次调用此方法,它将不断返回同一个赛车队列。但我的期望是,一旦被调用,除非将更多的赛车手添加到finishedRacers队列中,否则它应该是一个空队列。

2 个答案:

答案 0 :(得分:0)

很难在如此小的代码中找到错误。

使用 finishedRacers 的下一个代码段。使用您在代码中使用的方法扩展下面的列表,并使用 BugFinderList

实现 finishedRacers

它可以帮助您找到错误。


public class BugFinderList extends LinkedList {

    @Override
    public synchronized boolean add(Object o) {
        boolean result = super.add(o);
        System.out.println("[Add] List size is ["+size()+"]");
        return result;
    }

    @Override
    public synchronized void clear() {
        super.clear();
        System.out.println("[Clear] List size is ["+size()+"]");
    }

    @Override
    public synchronized Object poll() {
        Object result = super.poll();
        System.out.println("[Poll] List size is ["+size()+"]");
        return result;
    }
}

答案 1 :(得分:0)

问题在于打印出赛车手的代码。这是问题代码:

q = currentEvent.getCurrentFinished();
if(q.isEmpty()) q.addAll(finishedRacers.get(run));

我不知道在做研究之前,在返回时调用addAll方法也会将它添加到引用的队列中,我认为更改将是本地的。使用此代码修复它:

Queue<Racer> q1 = currentEvent.getCurrentFinished();
if(q1.isEmpty()) q.addAll(finishedRacers.get(run));
else q.addAll(q1);

这样我就不会在返回的队列上调用addAll。