Java PriorityQueue未排序,有时引发异常

Java PriorityQueue未排序,有时引发异常,java,Java,我运行请求线程 Task t = new Task(s1, s2, c, p); Requestor req = new Requestor(queue, t); req.start(); 它将任务添加到队列并运行服务线程 queue.add(task); // my class Service ser = new Service(queue); ser.start(); 添加方法 public void add(Task t) { synchronized (mutex) {

我运行请求线程

Task t = new Task(s1, s2, c, p);

Requestor req = new Requestor(queue, t);
req.start();
它将任务添加到队列并运行服务线程

queue.add(task); // my class

Service ser = new Service(queue);
ser.start();
添加方法

public void add(Task t) {
    synchronized (mutex) {
        queue.add(t); // PriorityQueue<Task>

        list.clear(); // DefaultListModel

        for (Task ta : queue)
            list.addElement(ta);
    }
}
流行方法

public Task pop() {
    synchronized (mutex) {
        ArrayList<Task> al = new ArrayList<Task>();

        Task tmp = queue.remove();
        al.add(tmp);

        while (tmp.isFinish() && !queue.isEmpty()) {
            tmp = queue.remove();
            al.add(tmp);
        }

        al.remove(al.size()-1);

        for (Task t : al) {
            queue.add(t);
        }

        list.clear();

        for (Task ta : queue)
            list.addElement(ta);

        return tmp;
    }
}
----编辑 桂

--编辑

我实现了与任务类类似的功能。如果我返回1,它总是在底部添加新的o元素,当我返回-1时,它总是在顶部添加新元素,但当

@Override
public int compareTo(Task o) {
    if (pr == o.getPriority())
        return 0;
    else if (pr > o.getPriority())
        return 1;
    else
        return -1;
}

它按需排序

优先级队列是一个堆,当您使用remove()方法时,它正在重建

公共作废添加(任务t){
已同步(互斥){
添加(t);
list.clear();
ArrayList al=新的ArrayList();
while(queue.size()>0)
al.add(queue.remove());
对于(任务ta:al){
列表.附录(ta);
添加(ta);
}
}
}

PriorityQueue是一个堆,当您使用remove()方法时,它正在重建

公共作废添加(任务t){
已同步(互斥){
添加(t);
list.clear();
ArrayList al=新的ArrayList();
while(queue.size()>0)
al.add(queue.remove());
对于(任务ta:al){
列表.附录(ta);
添加(ta);
}
}
}

按顺序返回
PriorityQueue
的唯一方法是
remove()
。迭代它不会按顺序返回元素。请参阅Javadoc。

按顺序返回
PriorityQueue
的唯一方法是
remove()
。迭代它不会按顺序返回元素。请参阅Javadoc。

问题可能出在与Swing相关的代码中,我在这里没有看到发布的更新。我发布了GUI.java的重要(I thing)部分,发布了队列类(2方法+构造函数),发布了请求者、服务和TaskComparator,发布了任务类not inportantPriorityQueue not blocking。如果请求的元素为null,将引发异常。您可以改为使用PriorityBlockingQueue。@Stephan:我只是实现了,而不是workPriorityBlockingQueue不会引发异常,但仍然没有进行排序更正问题可能出在与Swing相关的代码中,我在这里没有看到发布的。Update。我发布了GUI.java的重要(I thing)部分,发布了队列类(2方法+构造函数),发布了请求者、服务和TaskComparator,发布了任务类not inportantPriorityQueue not blocking。如果请求的元素为null,将引发异常。您可以改用PriorityBlockingQueue。@Stephan:我只是实现了,而不是workPriorityBlockingQueue不会引发异常,但排序仍然不正确
    Comparator<Task> cmp = new TaskComparator();

    queue = new PriorityQueue<Task>(20, cmp);
 public class TaskComparator implements Comparator<Task> {

@Override
public int compare(Task o1, Task o2) {
    return o1.getPriority() - o2.getPriority();
}

}
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1 >= 0
at java.util.Vector.elementAt(Vector.java:427)
at javax.swing.DefaultListModel.getElementAt(DefaultListModel.java:70)
...
private Queue queue;
...
    _add.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
...
            Task t = new Task(s1, s2, c, p);

            Requestor req = new Requestor(queue, t);
            req.start();
        }
    });
...
    JScrollPane scrollPane = new JScrollPane();
    contentPane.add(scrollPane, BorderLayout.CENTER);

    DefaultListModel model = new DefaultListModel();

    JList _list = new JList(model);
    scrollPane.setViewportView(_list);

    queue = new Queue(model);
@Override
public int compareTo(Task o) {
    if (pr == o.getPriority())
        return 0;
    else if (pr > o.getPriority())
        return 1;
    else
        return -1;
}
public void add(Task t) {
    synchronized (mutex) {
        queue.add(t);

        list.clear();

        ArrayList<Task> al = new ArrayList<Task>();

        while (queue.size() > 0)
            al.add(queue.remove());

        for (Task ta : al) {
            list.addElement(ta);
            queue.add(ta);
        }
    }
}