Я пытаюсь создать класс в Java, который объединяет объекты.Класс начинает создавать минимальное количество требуемых объектов, когда запросы начинают срабатывать, каждый поток проверяет, есть ли доступный объект, может ли он создать его, потому что максимум еще не достигнут, или если в противном случае он должен ждатьget one.
Идея состоит в том, что потоки должны синхронизироваться, чтобы получить / создать движок, но они могут обрабатываться параллельно (метод ProcessWithEngine
).Обработка может занять пару минут, и, очевидно, она работает так, как я хочу.
Проблема в том, что иногда , когда вызывается .notify()
и поток освобождается из .wait()
, в очереди 0 элементов, и это должно быть невозможно, поскольку непосредственно перед .notify()
добавляется элемент.
В чем может быть проблема?
Код выглядит так:
Queue _queue = new Queue();
int _poolMax = 4;
int _poolMin = 1;
int _poolCurrent =0;
public void Process(Object[] parameters) throws Exception
{
Engine engine = null;
synchronized(_queue)
{
if(_queue.isEmpty() && _poolCurrent >= _poolMax)
{
_queue.wait();
// HERE : sometimes _queue.isEmpty() is true at this point.
engine = (SpreadsheetEngine)_queue.dequeue();
}
else if (_queue.isEmpty() && _poolCurrent < _poolMax)
{
engine = CreateEngine();
_poolCurrent++;
}
else
{
engine = (Engine)_queue.dequeue();
}
}
ProcessWithEngine(engine, parameters);
// work done
synchronized(_queue)
{
_queue.enqueue(engine);
_queue.notify();
}
}
Я исправил это делает это:
do
{
_queue.wait();
}
while(_queue.isEmpty());
Но в основном это означает, что поток теряет свой ход, и это может означать тайм-аутпозже.