使用ArrayList在Java中实现同步队列

时间:2013-01-04 12:24:31

标签: java arraylist synchronization queue

我一直在处理一个需要同步队列的项目,因为我的程序是多线程的,并且线程可以访问此队列。 我使用arraylist来做到这一点,但我似乎有一些问题,线程陷入僵局。我不知道队列是否是原因,但我只是想检查一下:

public class URLQueue {
    private ArrayList<URL> urls;

    public URLQueue() {
        urls = new ArrayList<URL>();
    }

    public synchronized URL remove() throws InterruptedException {
        while (urls.isEmpty())
            wait();
        URL r = urls.remove(0);
        notifyAll();
        return r;
    }

    public synchronized void add(URL newURL) throws InterruptedException {
        urls.add(newURL);
        notifyAll();
    }

    public int getSize() {
        return urls.size();
    }
}

编辑: 即使使用LinkedBlockingQueue,我也会遇到与以前相同的循环。我认为这是因为有一个线程正在等待队列被填充,但它永远不会,因为其他功能已经完成运行...任何想法???

2 个答案:

答案 0 :(得分:4)

最好在此处使用LinkedBlockingQueue,因为它是为此目的而设计的。它会等到某个元素可用时才会尝试删除调整。

LinkedBlockingQueue

它提供了take()方法

  

检索并移除此队列的头部,必要时等待,直到元素可用

答案 1 :(得分:0)

在您的代码中,notifyAll()不会抛出InterruptedException,因此您应该从throws

中删除add()

remove()方法不需要notifyAll(),因为它的操作不应该唤醒其他线程。

getSize()方法应该同步。

否则,您的代码没有机会死锁,因为您需要两个锁来创建死锁。