Mega Code Archive

 
Categories / Java Tutorial / Collections
 

Synchronized Queue

/*  * Copyright (c) 2003 - 2007 OpenSubsystems s.r.o. Slovak Republic. All rights reserved.  *   * Project: OpenSubsystems  *   * $Id: SynchronizedQueue.java,v 1.4 2007/01/07 06:14:00 bastafidli Exp $  *   * This program is free software; you can redistribute it and/or modify  * it under the terms of the GNU General Public License as published by  * the Free Software Foundation; version 2 of the License.   *   * This program is distributed in the hope that it will be useful,  * but WITHOUT ANY WARRANTY; without even the implied warranty of  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  * GNU General Public License for more details.  *   * You should have received a copy of the GNU General Public License  * along with this program; if not, write to the Free Software  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   */ import java.util.LinkedList; import java.util.List; /**  * Class that implement unlimited queue, that is synchronized. It means that  * the consumer of the objects from the queue waits/is blocked in the get   * method until there is an object available.  *  * @version $Id: SynchronizedQueue.java,v 1.4 2007/01/07 06:14:00 bastafidli Exp $  * @author Miro Halas  * @code.reviewer Miro Halas  * @code.reviewed Initial revision  */ public class SynchronizedQueue {    // Attributes ///////////////////////////////////////////////////////////////        /**     * Cache of object produced by producer and consumed by consumer.     */    protected List m_lstObjects;    // Constructors /////////////////////////////////////////////////////////////        /**     * Constructor for Synchronized Queue Object.     */    public SynchronizedQueue(    )    {       super();       m_lstObjects = new LinkedList();    }    // Logic ////////////////////////////////////////////////////////////////////        /**     * Destructor for Synchronized Queue. It is called when no other     * object holds reference to it.     *     * @exception Throwable - default destructor exception     */    protected void finalize(    ) throws Throwable    {       // Explicitely remove this just to help garbage collector       m_lstObjects.clear();       m_lstObjects = null;       super.finalize();    }    /**     * Get the object from the beginning of the queue     *     * @return Object - object from the queue, if the thread is blocked in this     *                  function and you call interrupt method, an InterruptedException     *                  will be thrown.     * @exception InterruptedException - if the thread is blocked in this     *                                   function and you call interrupt method,     *                                   an InterruptedException will be thrown.     */    public synchronized Object get(    ) throws InterruptedException    {       Object objReturn = null;       if (m_lstObjects.isEmpty())       {          // There is no object in the queue, go to sleep          try          {             wait();          }          catch (InterruptedException ieException)          {             // Somebody woke us up, that means all threads waiting on this             // object competed for the lock and this one won and the object is             // locked again             // The thread can be woken up in two conditions, producer put new             // object into the queue or somebody called interrupt - to interrupt             // the wait - in this case rethrow an exception             if (m_lstObjects.isEmpty())             {                throw ieException;             }          }       }       // Remove the first object in the queue       objReturn = m_lstObjects.remove(0);       return objReturn;    }    /**     * Put the object to the end of the queue.     *     * @param objNew - new object, can be null     */    public synchronized void put(       Object objNew    )    {       m_lstObjects.add(objNew);       // New object in the queue, notify others       notifyAll();    }    /**     * Test if the queue is empty.     *     * @return boolean - true if the queue is empty     */    public synchronized boolean isEmpty(    )    {       return m_lstObjects.isEmpty();    } }