// @topic T11804 Multithreading -- Order Queue demo
// @brief class OrderQueue

package pckg;

import java.util.LinkedList;

public class OrderQueue
{
    private LinkedList< Order > orderQueue = new LinkedList<>();

    /**Adds the specified order to the queue*/
    public synchronized void pushOrder( Order order )
    {
        orderQueue.addLast( order );
        // notify any waiting threads
        notifyAll();  
    }

    /**Retrieves the first available order from the queue*/
    public synchronized Order pullOrder()
    {
        // if no orders in queue, wait
        while ( orderQueue.size() == 0 )
        {
            try
            {
                // Invoke Object's class method to wait until there
                // is a wake-up call (e.g. notifyAll) from another thread:
                wait();
            }
            catch ( InterruptedException ex )
            {
                // ignore interruptions
            }
        }
        return orderQueue.removeFirst();
    }
}