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>