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