1

我一直在做一个需要同步队列的项目,因为我的程序是多线程的,线程可以访问这个队列。我使用 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 时,我也会陷入与以前相同的循环中。我认为这是因为有一个线程正在等待队列被填充,但它从来没有因为其他功能已经完成运行......任何想法???

4

2 回答 2

4

最好在LinkedBlockingQueue这里使用,因为它是为此目的而设计的。在尝试删除元素时,它会一直等到某个元素可用。

链接阻塞队列

它提供了一种take()方法

检索并删除此队列的头部,如有必要,等待元素可用

于 2013-01-04T12:38:36.377 回答
0

在您的代码中,notifyAll()不会抛出 InterruptedException 因此您应该删除throwsfromadd()

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

getSize()方法应该是同步的。

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

于 2013-01-04T12:32:48.573 回答