You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@avalon.apache.org by je...@apache.org on 2002/04/25 11:38:24 UTC

cvs commit: jakarta-avalon-excalibur/event/src/test QueueTest.java

jefft       02/04/25 02:38:24

  Added:       event/src/test QueueTest.java
  Removed:     all/src/test QueueTest.java
  Log:
  Move QueueTest.java to Event, where it seems more appropriate now.
  
  Revision  Changes    Path
  1.1                  jakarta-avalon-excalibur/event/src/test/QueueTest.java
  
  Index: QueueTest.java
  ===================================================================
  
  import org.apache.avalon.excalibur.event.DefaultQueue;
  import org.apache.avalon.excalibur.event.Queue;
  import org.apache.avalon.excalibur.event.QueueElement;
  import org.apache.avalon.excalibur.event.Sink;
  import org.apache.avalon.excalibur.event.SinkException;
  import org.apache.avalon.excalibur.event.Source;
  import org.apache.avalon.framework.CascadingRuntimeException;
  
  /**
   * Simple test to expose the thread queue bug
   *
   * @author <a href="mailto:proyal@managingpartners.com">Peter Royal</a>
   * @version VSS $Revision: 1.1 $ $Date: 2002/04/25 09:38:24 $
   */
  public class QueueTest
  {
      private QueueStart start;
      private QueueEnd end;
  
      private Queue queue;
  
      private Thread[] stages;
  
      public static void main( String[] args ) throws Exception
      {
          QueueTest qt = new QueueTest();
  
          qt.initialize( Integer.parseInt( args[ 0 ] ) );
          qt.start();
      }
  
      public void initialize( int count ) throws Exception
      {
          this.stages = new Thread[ 2 ];
  
          this.queue = new DefaultQueue();
  
          this.start = new QueueStart( count );
          this.start.setSink( this.queue );
          this.stages[ 0 ] = new Thread( this.start );
  
          this.end = new QueueEnd();
          this.end.setSource( this.queue );
          this.stages[ 1 ] = new Thread( this.end );
      }
  
      public void start() throws Exception
      {
          System.out.println( "Starting test" );
  
          for( int i = 0; i < this.stages.length; i++ )
          {
              this.stages[ i ].start();
          }
  
          stop();
      }
  
      public void stop() throws Exception
      {
          for( int i = 0; i < this.stages.length; i++ )
          {
              try
              {
                  this.stages[ i ].join();
              }
              catch( InterruptedException e )
              {
                  throw new CascadingRuntimeException( "Stage unexpectedly interrupted", e );
              }
          }
  
          System.out.println( "Test complete" );
  
          System.out.println( "Enqueue: " + this.start.getCount() );
          System.out.println( "Dequeue: " + this.end.getCount() );
      }
  
      private class QueueInteger implements QueueElement
      {
          private int integer;
  
          public QueueInteger( int integer )
          {
              this.integer = integer;
          }
  
          public int getInteger()
          {
              return integer;
          }
      }
  
      private class QueueStart implements Runnable
      {
          private Sink sink;
          private int queueCount;
          private int count;
  
          public QueueStart( int queueCount )
          {
              this.queueCount = queueCount;
          }
  
          protected void setSink( Sink sink )
          {
              this.sink = sink;
          }
  
          public int getCount()
          {
              return count;
          }
  
          public void run()
          {
              for( int i = 0; i < this.queueCount; i++ )
              {
                  try
                  {
                      this.sink.enqueue( new QueueInteger( i ) );
                      this.count++;
                  }
                  catch( SinkException e )
                  {
                      System.out.println( "Unable to queue: " + e.getMessage() );
                  }
              }
  
              try
              {
                  this.sink.enqueue( new QueueInteger( -1 ) );
              }
              catch( SinkException e )
              {
                  System.out.println( "Unable to queue stop" );
              }
          }
      }
  
      private class QueueEnd implements Runnable
      {
          private Source source;
          private int count;
  
          protected void setSource( Source source )
          {
              this.source = source;
          }
  
          public int getCount()
          {
              return count;
          }
  
          public void run()
          {
              while( true )
              {
                  QueueElement qe = this.source.dequeue();
  
                  if( qe == null )
                  {
  
                  }
                  else if( qe instanceof QueueInteger )
                  {
                      QueueInteger qi = (QueueInteger)qe;
  
                      if( qi.getInteger() == -1 )
                      {
                          break;
                      }
                      else
                      {
                          this.count++;
                      }
                  }
              }
          }
      }
  }
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>