donaldp 2002/09/28 01:46:35
Added: thread/src/java/org/apache/avalon/excalibur/thread/impl
SimpleThreadPool.java
Log:
Add in pool that binds to legacy pooling architecture
Revision Changes Path
1.1
jakarta-avalon-excalibur/thread/src/java/org/apache/avalon/excalibur/thread/impl/SimpleThreadPool.java
Index: SimpleThreadPool.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.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 SimpleThreadPool
extends AbstractThreadPool
implements ObjectFactory, LogEnabled, Disposable, ThreadPool
{
/**
* The underlying pool.
*/
private SoftResourceLimitingPool 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 capacity the capacity of pool
* @throws Exception if unable to create pool
*/
public SimpleThreadPool( final ThreadGroup threadGroup,
final int capacity )
throws Exception
{
this( threadGroup, "Worker Pool", capacity );
}
/**
* 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 capacity the capacity of pool
* @throws Exception if unable to create pool
*/
public SimpleThreadPool( final ThreadGroup threadGroup,
final String name,
final int capacity )
throws Exception
{
this( threadGroup, name, capacity );
}
/**
* 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 capacity the capacity of pool
* @param context the thread context associated with pool (May be null).
* @throws Exception if unable to create pool
*/
public SimpleThreadPool( final ThreadGroup threadGroup,
final String name,
final int capacity,
final ThreadContext context )
throws Exception
{
super( name, threadGroup );
m_pool = new SoftResourceLimitingPool( this, capacity );
m_context = context;
}
/**
* Setup Logging.
*
* @param logger the logger
*/
public void enableLogging( final Logger logger )
{
m_logger = logger;
m_pool.enableLogging( m_logger );
}
/**
* Dispose of underlying pool and cleanup resources.
*/
public void dispose()
{
m_pool.dispose();
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 )
{
throw new IllegalStateException( "Unable to access thread pool due to "
+ e );
}
}
/**
* 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]>