【发布时间】:2013-01-04 12:24:31
【问题描述】:
我一直在做一个需要同步队列的项目,因为我的程序是多线程的,线程可能会访问这个队列。 我使用 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 时,我也会陷入与以前相同的循环中。我认为这是因为有一个线程正在等待队列被填满,但它从来没有因为其他功能已经完成运行......任何想法???
【问题讨论】:
-
出于兴趣,为什么不使用专门为此目的设计的现有队列类?
-
你为什么不使用
Queue? Java 已经有很多该内置函数的实现。 -
我会使用 ExecutorService,因为它将队列和线程池封装在一个中。有内置队列可以做你想做的事,但你甚至不需要直接使用它们。
-
如果您遇到死锁,死锁发生在哪里,因为这是您应该查看的代码。使用调试器或 jstack 查看所有线程的状态,并找出死锁发生时它在做什么。
-
我将循环 Queue 类并可能会使用它。谢谢!
标签: java arraylist synchronization queue