Я пытаюсь понять многопоточные конструкции Java и пытаюсь написать простую реализацию очереди блокировки.Вот код, который я написал:
class BlockingBoundedQueue<E>
{
@SuppressWarnings("unchecked")
BlockingBoundedQueue(int size)
{
fSize = size;
fArray = (E[]) new Object[size];
// fBlockingQueue = new ArrayBlockingQueue<E>(size);
}
BlockingQueue<E> fBlockingQueue;
public synchronized void put(E elem)
{
if(fCnt==fSize-1)
{
try
{
// Should I be waiting/locking on the shared array instead ? how ?
wait();
}
catch (InterruptedException e)
{
throw new RuntimeException("Waiting thread was interrupted during put with msg:",e);
}
}
else
{
fArray[fCnt++]=elem;
//How to notify threads waiting during take()
}
}
public synchronized E take()
{
if(fCnt==0)
{
try
{
// Should I be waiting/locking on the shared array instead ? how ?
wait();
}
catch (InterruptedException e)
{
throw new RuntimeException("Waiting thread was interrupted during take with msg:",e);
}
}
return fArray[fCnt--];
//How to notify threads waiting during put()
}
private int fCnt;
private int fSize;
private E[] fArray;
}
Я хочу уведомить потоки, ожидающие в Take () от put () и наоборот.Может кто-нибудь, пожалуйста, помогите мне с правильным способом сделать это.
Я проверил реализацию java.utils, и она использует Condition и ReentrantLocks, которые на данном этапе немного сложны для меня.Я в порядке, пока я не полностью устойчив (но исправлен) ради простоты.
Спасибо!