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(); } }