我有多個線程使用共享變量queue
。處理之後(打印)它從隊列中刪除另一個線程從隊列中刪除元素?
protected void tryToPrint() {
while (true) {
try {
if (printer.isAvailable() && printer.isFair(this)) {
queueLock.lock();
try {
if (queue.isEmpty())
break;
printer.requestToPrint(this, queue.get(0));
queue.remove(0);
synchronized (System.out) {
System.out.println(getName() + " printed. queue size: " + queue.size());
}
} finally {
queueLock.unlock();
}
} else {
printer.requestToPrintNext(this);
}
} catch (IllegalPrintStateException e) {
e.printStackTrace();
}
}
}
的元素,但我得到
Exception in thread "Thread-1" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(ArrayList.java:604)
at java.util.ArrayList.remove(ArrayList.java:445)
at printer.ClientImpl.tryToPrint(ClientImpl.java:34)
at printer.AbstractClient.run(AbstractClient.java:28)
at java.lang.Thread.run(Thread.java:722)
我想另一個線程莫名其妙地刪除從隊列中的元素?我怎麼可能鎖定它?
UPDATE:隊列實際上是ArrayList<File>()
。如果它不是線程安全的,它是否重要?我確實鎖定了queueLock
?
'queue'的類型是什麼? – 2013-03-10 03:38:24
@CyrilleKa,它的'ArrayList()' –
2013-03-10 03:49:42
你可以發佈其他線程可能對隊列做什麼的代碼嗎?是否有可能其中一個不遵守'queueLock'? – angelatlarge 2013-03-10 04:07:12