/* Copyright (C) 2009 Diego Darriba 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; either version 2 of the License, or (at your option) any later version. 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 */ package es.uvigo.darwin.prottest.facade.thread; import java.util.Hashtable; import es.uvigo.darwin.prottest.util.exception.ProtTestInternalException; /** * Synchronization of all threads in a thread pool. This class * maps every thread to an internal unique thread identifier, which * can be used to manage temporary files. This manager is a singleton * class. * * @author Diego Darriba * * @since 3.0 */ public class ThreadPoolSynchronizer { /** Internal mapping of threads ids with sequential identifiers */ private Hashtable<Long, Integer> threadIds; /** The value of the next thread in the pool */ private int nextValue; /** The size of the thread pool */ private int poolSize; /** The unique instance of the class */ private static ThreadPoolSynchronizer instance; /** * Instantiates the synchronizer * * @param poolSize the size of the thread pool */ private ThreadPoolSynchronizer(int poolSize) { this.poolSize = poolSize; threadIds = new Hashtable<Long, Integer>(poolSize); nextValue = 0; } /** * Gets the internal identifier of a thread * * @param thread the thread * * @return the unique internal identifier */ public synchronized int getThreadId(Thread thread) { long threadNumber = thread.getId(); Integer value = threadIds.get(threadNumber); if (value == null) { if (nextValue >= poolSize) { throw new ProtTestInternalException("Thread out of sync on ThreadPool"); } // next value value = nextValue++; threadIds.put(threadNumber, value); } return value; } /** * Synchronizes a new manager. This method instantiates the unique * instance of the class. * * @param poolSize the size of the thread pool */ public static void synchronize(int poolSize) { instance = new ThreadPoolSynchronizer(poolSize); } /** * Gets the unique instance of the class. Before the first call of * this method, the class thread pool shoud be synchronized. * * @return the unique instance * * @throws ProtTestInternalException Signals that the thread pool is not synchronized. */ public synchronized static ThreadPoolSynchronizer getInstance() throws ProtTestInternalException { if (instance == null) { throw new ProtTestInternalException("ThreadPool out of sync"); } return instance; } }