У меня есть несколько потоков с использованием shared variabled 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)
Я полагаю, другой поток каким-то образом удаляется элемент из очереди? Как это возможно, я закрыл его?
ОБНОВЛЕНИЕ: очередь на самом деле является ArrayList<File>()
. Имеет ли значение, если это не потоковая безопасность? Я заблокировал queueLock
?
Каков тип 'queue'? –
@CyrilleKa, его 'ArrayList()' –
Можете ли вы отправить код для того, что другие потоки могут сделать в очереди? Возможно ли, что один из них не почитает 'queueLock'? – angelatlarge