donaldp 2002/09/28 02:31:01 Modified: thread default.properties thread/src/java/org/apache/avalon/excalibur/thread ThreadPool.java thread/src/java/org/apache/avalon/excalibur/thread/impl DefaultThreadPool.java ResourceLimitingThreadPool.java Added: thread/src/java/org/apache/avalon/excalibur/thread/impl BasicThreadPool.java Removed: thread/src/java/org/apache/avalon/excalibur/thread/impl DefaultThreadControl.java ExecutableRunnable.java SimpleThreadPool.java WorkerThread.java Log: Updated the thread implementation to support the new Avalon/Pool independent API. Maintain backwards compatability using a few hoops. Deprecated all code except the Default and ResourceLimiting ThreadPools which have not yet been reimplemented. Revision Changes Path 1.13 +2 -2 jakarta-avalon-excalibur/thread/default.properties Index: default.properties =================================================================== RCS file: /home/cvs/jakarta-avalon-excalibur/thread/default.properties,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- default.properties 7 Aug 2002 16:33:23 -0000 1.12 +++ default.properties 28 Sep 2002 09:31:01 -0000 1.13 @@ -33,8 +33,8 @@ excalibur-pool.jar=${excalibur-pool.lib}/excalibur-pool-1.1.jar # ----- Excalibur instrument, version 0.1 or later ----- -excalibur-instrument.home=${basedir}/../instrument/dist -excalibur-instrument.lib=${excalibur-instrument.home} +excalibur-instrument.home=${basedir}/../instrument/build +excalibur-instrument.lib=${excalibur-instrument.home}/lib excalibur-instrument.jar=${excalibur-instrument.lib}/excalibur-instrument-0.3.jar # ----- Excalibur Collections, version 1.0 or later ----- 1.3 +3 -9 jakarta-avalon-excalibur/thread/src/java/org/apache/avalon/excalibur/thread/ThreadPool.java Index: ThreadPool.java =================================================================== RCS file: /home/cvs/jakarta-avalon-excalibur/thread/src/java/org/apache/avalon/excalibur/thread/ThreadPool.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- ThreadPool.java 5 Aug 2002 14:21:06 -0000 1.2 +++ ThreadPool.java 28 Sep 2002 09:31:01 -0000 1.3 @@ -8,23 +8,17 @@ package org.apache.avalon.excalibur.thread; import org.apache.avalon.framework.activity.Executable; +import org.apache.excalibur.thread.ThreadControl; /** * This class is the public frontend for the thread pool code. * * @author <a href="mailto:peter at apache.org">Peter Donald</a> + * @deprecated Replaced with org.apache.excalibur.thread.ThreadPool */ public interface ThreadPool + extends org.apache.excalibur.thread.ThreadPool { - /** - * Run work in separate thread. - * Return a valid ThreadControl to control work thread. - * - * @param work the work to be executed. - * @return the ThreadControl - */ - ThreadControl execute( Runnable work ); - /** * Run work in separate thread. * Return a valid ThreadControl to control work thread. 1.10 +20 -48 jakarta-avalon-excalibur/thread/src/java/org/apache/avalon/excalibur/thread/impl/DefaultThreadPool.java Index: DefaultThreadPool.java =================================================================== RCS file: /home/cvs/jakarta-avalon-excalibur/thread/src/java/org/apache/avalon/excalibur/thread/impl/DefaultThreadPool.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- DefaultThreadPool.java 5 Aug 2002 14:21:06 -0000 1.9 +++ DefaultThreadPool.java 28 Sep 2002 09:31:01 -0000 1.10 @@ -9,7 +9,6 @@ import org.apache.avalon.excalibur.pool.ObjectFactory; import org.apache.avalon.excalibur.pool.SoftResourceLimitingPool; -import org.apache.avalon.excalibur.thread.ThreadControl; import org.apache.avalon.excalibur.thread.ThreadPool; import org.apache.avalon.framework.activity.Disposable; import org.apache.avalon.framework.activity.Executable; @@ -17,6 +16,8 @@ import org.apache.avalon.framework.logger.LogKitLogger; import org.apache.avalon.framework.logger.Loggable; import org.apache.avalon.framework.logger.Logger; +import org.apache.avalon.framework.container.ContainerUtil; +import org.apache.excalibur.thread.ThreadControl; import org.apache.excalibur.threadcontext.ThreadContext; /** @@ -29,13 +30,8 @@ extends ThreadGroup implements ObjectFactory, Loggable, LogEnabled, Disposable, ThreadPool { - private SoftResourceLimitingPool m_pool; - - private int m_level; - - private Logger m_logger; - - private ThreadContext m_context; + private final BasicThreadPool m_pool; + private SoftResourceLimitingPool m_underlyingPool; public DefaultThreadPool( final int capacity ) throws Exception @@ -55,8 +51,8 @@ throws Exception { super( name ); - m_pool = new SoftResourceLimitingPool( this, capacity ); - m_context = context; + m_underlyingPool = new SoftResourceLimitingPool( this, capacity ); + m_pool = new BasicThreadPool( this, name, m_underlyingPool, context ); } public void setLogger( final org.apache.log.Logger logger ) @@ -66,45 +62,27 @@ public void enableLogging( final Logger logger ) { - m_logger = logger; - m_pool.enableLogging( m_logger ); + ContainerUtil.enableLogging( m_pool, logger ); } public void dispose() { m_pool.dispose(); - m_pool = null; } public Object newInstance() { - final String name = getName() + " Worker #" + m_level++; - - ThreadContext context = null; - if( null != m_context ) - { - context = m_context.duplicate(); - } - - final WorkerThread worker = - new WorkerThread( this, name, m_pool, context ); - worker.setDaemon( true ); - worker.enableLogging( m_logger ); - worker.start(); - return worker; + return m_pool.newInstance(); } public void decommission( final Object object ) { - if( object instanceof WorkerThread ) - { - ((WorkerThread)object).dispose(); - } + m_pool.decommission( object ); } public Class getCreatedClass() { - return WorkerThread.class; + return m_pool.getCreatedClass(); } /** @@ -114,9 +92,9 @@ * @param work the work to be executed. * @return the ThreadControl */ - public ThreadControl execute( final Runnable work ) + public ThreadControl execute( final Executable work ) { - return execute( new ExecutableRunnable( work ) ); + return m_pool.execute( work ); } /** @@ -126,26 +104,20 @@ * @param work the work to be executed. * @return the ThreadControl */ - public ThreadControl execute( final Executable work ) + public ThreadControl execute( final Runnable work ) { - final WorkerThread worker = getWorker(); - return worker.execute( work ); + return m_pool.execute( work ); } /** - * Retrieve a worker thread from pool. + * Run work in separate thread. + * Return a valid ThreadControl to control work thread. * - * @return the worker thread retrieved from pool + * @param work the work to be executed. + * @return the ThreadControl */ - protected WorkerThread getWorker() + public ThreadControl execute( final org.apache.excalibur.thread.Executable work ) { - try - { - return (WorkerThread)m_pool.get(); - } - catch( final Exception e ) - { - throw new IllegalStateException( "Unable to access thread pool due to " + e ); - } + return m_pool.execute( work ); } } 1.7 +78 -140 jakarta-avalon-excalibur/thread/src/java/org/apache/avalon/excalibur/thread/impl/ResourceLimitingThreadPool.java Index: ResourceLimitingThreadPool.java =================================================================== RCS file: /home/cvs/jakarta-avalon-excalibur/thread/src/java/org/apache/avalon/excalibur/thread/impl/ResourceLimitingThreadPool.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- ResourceLimitingThreadPool.java 5 Aug 2002 14:21:06 -0000 1.6 +++ ResourceLimitingThreadPool.java 28 Sep 2002 09:31:01 -0000 1.7 @@ -11,13 +11,14 @@ import org.apache.excalibur.instrument.Instrumentable; import org.apache.avalon.excalibur.pool.ObjectFactory; import org.apache.avalon.excalibur.pool.ResourceLimitingPool; -import org.apache.avalon.excalibur.thread.ThreadControl; import org.apache.avalon.excalibur.thread.ThreadPool; import org.apache.avalon.framework.activity.Disposable; import org.apache.avalon.framework.activity.Executable; import org.apache.avalon.framework.logger.LogEnabled; import org.apache.avalon.framework.logger.Logger; +import org.apache.avalon.framework.container.ContainerUtil; import org.apache.excalibur.threadcontext.ThreadContext; +import org.apache.excalibur.thread.ThreadControl; /** * A Thread Pool which can be configured to have a hard limit on the maximum number of threads @@ -38,15 +39,16 @@ extends ThreadGroup implements ObjectFactory, LogEnabled, Disposable, ThreadPool, Instrumentable { - - private ResourceLimitingPool m_pool; - private int m_level; - private Logger m_logger; - private ThreadContext m_context; + private ResourceLimitingPool m_underlyingPool; /** Instrumentable Name assigned to this Instrumentable */ private String m_instrumentableName; + /** + * The associated thread pool. + */ + private BasicThreadPool m_pool; + /*--------------------------------------------------------------- * Constructors *-------------------------------------------------------------*/ @@ -130,116 +132,19 @@ { super( name ); - m_pool = new ResourceLimitingPool - ( this, max, maxStrict, blocking, blockTimeout, trimInterval ); - m_context = context; - } - - /*--------------------------------------------------------------- - * ObjectFactory Methods - *-------------------------------------------------------------*/ - - /** - * Creates and returns a new <code>WorkerThread</code>. - * - * @return new worker thread - * - */ - public Object newInstance() - { - final String name = - new StringBuffer( getName() ).append( " Worker #" ).append( m_level++ ).toString(); - final WorkerThread worker = new WorkerThread( this, name, m_pool, m_context ); - worker.setDaemon( true ); - worker.enableLogging( m_logger ); - worker.start(); - - return worker; - } - - /** - * Returns the class of which this <code>ObjectFactory</code> creates instances. - * - * @return WorkerThread.class - * - */ - public Class getCreatedClass() - { - return WorkerThread.class; - } - - /** - * Cleans up any resources associated with the specified object and takes it - * out of commission. - * - * @param object the object to be decommissioned - * - */ - public void decommission( final Object object ) - { - if( object instanceof WorkerThread ) + m_underlyingPool = + new ResourceLimitingPool( this, max, maxStrict, + blocking, blockTimeout, + trimInterval ); + try { - ( (WorkerThread)object ).dispose(); + m_pool = new BasicThreadPool(this, name, m_underlyingPool, context ); + } + catch( Exception e ) + { + final String message = "Unable to create ThreadPool due to " + e; + throw new IllegalStateException( message ); } - } - - /*--------------------------------------------------------------- - * LogEnabled Methods - *-------------------------------------------------------------*/ - /** - * Set the logger. - * - * @param logger - * - */ - public void enableLogging( final Logger logger ) - { - m_logger = logger; - - m_pool.enableLogging( m_logger ); - } - - /*--------------------------------------------------------------- - * Disposable Methods - *-------------------------------------------------------------*/ - /** - * Clean up resources and references. - * - */ - public void dispose() - { - m_pool.dispose(); - - m_pool = null; - } - - /*--------------------------------------------------------------- - * ThreadPool Methods - *-------------------------------------------------------------*/ - /** - * Run work in separate thread. - * Return a valid ThreadControl to control work thread. - * - * @param work the work to be executed. - * @return the ThreadControl - */ - public ThreadControl execute( final Runnable work ) - { - return execute( new ExecutableRunnable( work ) ); - } - - /** - * Run work in separate thread. - * Return a valid ThreadControl to control work thread. - * - * @param work the work to be executed. - * @return the ThreadControl - */ - public ThreadControl execute( final Executable work ) - { - final WorkerThread worker = getWorker(); - - return worker.execute( work ); } /*--------------------------------------------------------------- @@ -300,44 +205,77 @@ */ public Instrumentable[] getChildInstrumentables() { - return new Instrumentable[]{m_pool}; + return new Instrumentable[]{m_underlyingPool}; } - /*--------------------------------------------------------------- - * Methods - *-------------------------------------------------------------*/ /** - * Retrieve a worker thread from pool. - * - * @return the worker thread retrieved from pool + * Return the number of worker threads in the pool. * - * @todo remove the line: - * <code>worker.setContextClassLoader(Thread.currentThread().getContextClassLoader());</code> + * @return the numebr of worker threads in the pool. */ - protected WorkerThread getWorker() + public int getSize() { - try - { - final WorkerThread worker = (WorkerThread)m_pool.get(); + return m_underlyingPool.getSize(); + } - // TODO: Remove next line - worker.setContextClassLoader( Thread.currentThread().getContextClassLoader() ); + public void enableLogging( final Logger logger ) + { + ContainerUtil.enableLogging( m_pool, logger ); + } - return worker; - } - catch( final Exception e ) - { - throw new IllegalStateException( "Unable to access thread pool due to " + e ); - } + public void dispose() + { + m_pool.dispose(); + } + + public Object newInstance() + { + return m_pool.newInstance(); + } + + public void decommission( final Object object ) + { + m_pool.decommission( object ); + } + + public Class getCreatedClass() + { + return m_pool.getCreatedClass(); } /** - * Return the number of worker threads in the pool. + * Run work in separate thread. + * Return a valid ThreadControl to control work thread. * - * @return the numebr of worker threads in the pool. + * @param work the work to be executed. + * @return the ThreadControl */ - public int getSize() + public ThreadControl execute( final Executable work ) + { + return m_pool.execute( work ); + } + + /** + * Run work in separate thread. + * Return a valid ThreadControl to control work thread. + * + * @param work the work to be executed. + * @return the ThreadControl + */ + public ThreadControl execute( final Runnable work ) + { + return m_pool.execute( work ); + } + + /** + * Run work in separate thread. + * Return a valid ThreadControl to control work thread. + * + * @param work the work to be executed. + * @return the ThreadControl + */ + public ThreadControl execute( final org.apache.excalibur.thread.Executable work ) { - return m_pool.getSize(); + return m_pool.execute( work ); } } 1.1 jakarta-avalon-excalibur/thread/src/java/org/apache/avalon/excalibur/thread/impl/BasicThreadPool.java Index: BasicThreadPool.java =================================================================== /* * Copyright (C) The Apache Software Foundation. All rights reserved. * * This software is published under the terms of the Apache Software License * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ package org.apache.avalon.excalibur.thread.impl; import org.apache.avalon.excalibur.pool.ObjectFactory; import org.apache.avalon.excalibur.pool.SoftResourceLimitingPool; import org.apache.avalon.excalibur.pool.Pool; import org.apache.avalon.excalibur.thread.ThreadPool; import org.apache.avalon.framework.activity.Disposable; import org.apache.avalon.framework.activity.Executable; import org.apache.avalon.framework.logger.LogEnabled; import org.apache.avalon.framework.logger.Logger; import org.apache.avalon.framework.container.ContainerUtil; import org.apache.excalibur.thread.ThreadControl; import org.apache.excalibur.thread.impl.AbstractThreadPool; import org.apache.excalibur.thread.impl.WorkerThread; import org.apache.excalibur.threadcontext.ThreadContext; /** * The ThreadPool that binds to Legacy Pooling implementation. * * @author <a href="mailto:[EMAIL PROTECTED]">Stefano Mazzocchi</a> * @author <a href="mailto:peter at apache.org">Peter Donald</a> * @deprecated Only used by deprecated components. Will remove in the future */ class BasicThreadPool extends AbstractThreadPool implements ObjectFactory, LogEnabled, Disposable, ThreadPool { /** * The underlying pool. */ private Pool m_pool; /** * The logger to use for debugging purposes. */ private Logger m_logger; /** * The base ThreadContext that can be duplicated for * each thread. */ private ThreadContext m_context; /** * Create a new ThreadPool with specified capacity. * * @param threadGroup the thread group used in pool * @param name the name of pool (used in naming threads) * @param pool the underling pool * @param context the thread context associated with pool (May be null). * @throws Exception if unable to create pool */ public BasicThreadPool( final ThreadGroup threadGroup, final String name, final Pool pool, final ThreadContext context ) throws Exception { super( name, threadGroup ); if( null == pool ) { throw new NullPointerException( "pool" ); } m_pool = pool; m_context = context; } /** * Setup Logging. * * @param logger the logger */ public void enableLogging( final Logger logger ) { m_logger = logger; ContainerUtil.enableLogging( m_pool, logger ); } /** * Dispose of underlying pool and cleanup resources. */ public void dispose() { ContainerUtil.dispose( m_pool ); m_pool = null; } /** * Create new Poolable instance. * * @return the new Poolable instance */ public Object newInstance() { return createWorker(); } /** * Overide newWorkerThread to provide a WorkerThread * that is Poolable and LogEnabled. * * @param name the name of WorkerThread * @return the created WorkerThread */ protected WorkerThread newWorkerThread( final String name ) { ThreadContext context = null; if( null != m_context ) { context = m_context.duplicate(); } final SimpleWorkerThread thread = new SimpleWorkerThread( this, getThreadGroup(), name, context ); ContainerUtil.enableLogging( thread, m_logger ); return thread; } public void decommission( final Object object ) { if( object instanceof WorkerThread ) { destroyWorker( (WorkerThread) object ); } } /** * Return the class of poolable instance. * * @return the class of poolable instance. */ public Class getCreatedClass() { return SimpleWorkerThread.class; } /** * Run work in separate thread. * Return a valid ThreadControl to control work thread. * * @param work the work to be executed. * @return the ThreadControl */ public ThreadControl execute( final Executable work ) { return execute( new ExecutableExecuteable( work ) ); } /** * Retrieve a worker thread from pool. * * @return the worker thread retrieved from pool */ protected WorkerThread getWorker() { try { return (WorkerThread) m_pool.get(); } catch( final Exception e ) { final String message = "Unable to access thread pool due to " + e; throw new IllegalStateException( message ); } } /** * Release worker back into pool. * * @param worker the worker (Should be a {@link SimpleWorkerThread}). */ protected void releaseWorker( final WorkerThread worker ) { m_pool.put( (SimpleWorkerThread) worker ); } }
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>