You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@avalon.apache.org by mc...@apache.org on 2003/05/04 19:19:32 UTC
cvs commit: avalon-cornerstone/threads/tutorial/src/java/org/apache/avalon/cornerstone/threads/tutorial Counter.java ThreadConsumer.java ThreadConsumer.xinfo
mcconnell 2003/05/04 10:19:32
Modified: threads maven.xml
Added: threads/tutorial .cvsignore project.xml
threads/tutorial/src/java/org/apache/avalon/cornerstone/threads/tutorial
Counter.java ThreadConsumer.java
ThreadConsumer.xinfo
Log:
Addition of a tutorial demonstrating the use of the Cornerstone Thread Manager.
Revision Changes Path
1.4 +7 -0 avalon-cornerstone/threads/maven.xml
Index: maven.xml
===================================================================
RCS file: /home/cvs/avalon-cornerstone/threads/maven.xml,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- maven.xml 4 May 2003 14:05:04 -0000 1.3
+++ maven.xml 4 May 2003 17:19:32 -0000 1.4
@@ -46,5 +46,12 @@
<attainGoal name="package-install"/>
</goal>
+ <!--
+ Fast build.
+ -->
+ <goal name="update">
+ <attainGoal name="package-install"/>
+ </goal>
+
</project>
1.1 avalon-cornerstone/threads/tutorial/.cvsignore
Index: .cvsignore
===================================================================
maven.log
velocity.log
build.properties
target
maven.log
logs
1.1 avalon-cornerstone/threads/tutorial/project.xml
Index: project.xml
===================================================================
<?xml version="1.0" encoding="ISO-8859-1"?>
<project>
<extend>${basedir}/../project.xml</extend>
<groupId>cornerstone</groupId>
<id>cornerstone-threads-tutorial</id>
<name>Cornerstone Threads Tutorial</name>
<currentVersion>1.0</currentVersion>
<package>org.apache.avalon.cornerstone.threads.tutorial</package>
<inceptionYear>2001</inceptionYear>
<shortDescription>Cornerstone Threads</shortDescription>
<dependencies>
<!-- cornerstone api dependencies -->
<dependency>
<groupId>cornerstone</groupId>
<artifactId>cornerstone-threads-api</artifactId>
<version>1.0</version>
</dependency>
<!-- avalon dependencies -->
<dependency>
<groupId>avalon</groupId>
<artifactId>avalon-framework</artifactId>
<version>4.1.4</version>
</dependency>
<!-- excalibur dependencies -->
<dependency>
<groupId>excalibur</groupId>
<artifactId>excalibur-thread</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>excalibur</groupId>
<artifactId>excalibur-event</artifactId>
<version>2.0</version>
</dependency>
<!-- pre JDK 1.4 dependencies -->
<dependency>
<id>xml-apis</id>
<version>1.0.b2</version>
<url>http://xml.apache.org/xerces2-j/</url>
</dependency>
<dependency>
<id>xerces</id>
<version>2.2.1</version>
<url>http://xml.apache.org/xerces2-j/</url>
</dependency>
</dependencies>
</project>
1.1 avalon-cornerstone/threads/tutorial/src/java/org/apache/avalon/cornerstone/threads/tutorial/Counter.java
Index: Counter.java
===================================================================
package org.apache.avalon.cornerstone.threads.tutorial;
import org.apache.avalon.framework.logger.LogEnabled;
import org.apache.avalon.framework.logger.Logger;
/**
* A demonstration runnable object that simply logs a countdown sequence.
*
* @author Stephen McConnell
*/
public class Counter extends Thread implements LogEnabled
{
/**
* The supplied logging channel.
*/
private Logger m_logger;
private int m_count = 10;
public void enableLogging( Logger logger )
{
m_logger = logger;
}
protected Logger getLogger()
{
return m_logger;
}
public void run()
{
while( m_count > 0 )
{
getLogger().info( "count: " + m_count );
m_count--;
try
{
sleep( 1000 );
}
catch( Throwable e )
{
getLogger().info( "I've been interrupted." );
m_count = -1;
}
}
getLogger().info( "Time to die." );
m_logger = null;
}
}
1.1 avalon-cornerstone/threads/tutorial/src/java/org/apache/avalon/cornerstone/threads/tutorial/ThreadConsumer.java
Index: ThreadConsumer.java
===================================================================
package org.apache.avalon.cornerstone.threads.tutorial;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.avalon.framework.service.Serviceable;
import org.apache.avalon.framework.service.ServiceManager;
import org.apache.avalon.framework.service.ServiceException;
import org.apache.avalon.framework.activity.Initializable;
import org.apache.avalon.framework.activity.Disposable;
import org.apache.avalon.excalibur.thread.ThreadControl;
import org.apache.avalon.excalibur.thread.ThreadPool;
import org.apache.avalon.cornerstone.services.threads.ThreadManager;
/**
* ThreadConsumer is a example of a component that uses the ThreadManager
* servicde to aquired a thread pool.
*
* @avalon.meta.version 1.0
* @avalon.meta.name consumer
* @author Stephen McConnell
*/
public class ThreadConsumer extends AbstractLogEnabled implements
Serviceable, Initializable, Disposable
{
/**
* The service manager fro which serrvices are aquired and released.
*/
private ServiceManager m_manager;
/**
* The cornerstone thread manager.
*/
private ThreadManager m_threads;
/**
* A thread control return from the launching of a new thread.
*/
private ThreadControl m_control;
/**
* Servicing of the component by the container during which the
* component aquires the ThreadManager service.
*
* @param manager the thread manager
* @exception ServiceException if the thread manager service is
* unresolvable
*/
public void service( ServiceManager manager ) throws ServiceException
{
m_manager = manager;
getLogger().info( "aquiring cornerstone threads service" );
m_threads = (ThreadManager) m_manager.lookup( "threads" );
}
/**
* Initialization of the component by the container during which we
* establish a child thread by passing a runnable object to the thread pool.
* @exception Exception if an initialization stage error occurs
*/
public void initialize() throws Exception
{
getLogger().info( "initialization" );
//
// get the default thread pool
//
ThreadPool pool = m_threads.getDefaultThreadPool();
//
// create a runnable object to run
//
Counter counter = new Counter();
counter.enableLogging( getLogger().getChildLogger( "counter" ) );
//
// start a thread and get the thread control reference
//
m_control = pool.execute( counter );
}
/**
* Disposal of the component during which he handle the closue of the
* child thread we have establshed during the initialization stage.
*/
public void dispose()
{
getLogger().info( "disposal" );
if( !m_control.isFinished() )
{
//
// interrupt the child
//
getLogger().info( "disposal invoked while child thread active" );
m_control.interrupt();
//
// Using m_control.join() locks things up - why? Using a
// wait for finished state instead.
//
while( !m_control.isFinished() )
{
getLogger().info( "waiting for child" );
try
{
Thread.sleep( 1000 );
}
catch( InterruptedException ie )
{
// ignore it
}
}
}
//
// check for errors
//
if( m_control.getThrowable() != null )
{
getLogger().info(
"thread terminated with exception condition",
m_control.getThrowable() );
}
m_manager.release( m_threads );
m_control = null;
m_threads = null;
m_manager = null;
getLogger().info( "disposal complete" );
}
}
1.1 avalon-cornerstone/threads/tutorial/src/java/org/apache/avalon/cornerstone/threads/tutorial/ThreadConsumer.xinfo
Index: ThreadConsumer.xinfo
===================================================================
<?xml version="1.0"?>
<!DOCTYPE type
PUBLIC "-//AVALON/Type DTD Version 1.0//EN"
"http://avalon.apache.org/dtds/meta/type_1_1.dtd" >
<type>
<info>
<name>thread-consumer</name>
<version>1.0</version>
</info>
<dependencies>
<dependency type="org.apache.avalon.cornerstone.services.threads.ThreadManager"
key="threads"/>
</dependencies>
</type>
---------------------------------------------------------------------
To unsubscribe, e-mail: cvs-unsubscribe@avalon.apache.org
For additional commands, e-mail: cvs-help@avalon.apache.org