1 17 package org.apache.excalibur.mpool; 18 19 import org.apache.avalon.framework.activity.Disposable; 20 import org.apache.commons.collections.BoundedFifoBuffer; 21 import org.apache.commons.collections.Buffer; 22 23 31 public final class FixedSizePool 32 implements Pool, Disposable 33 { 34 private boolean m_disposed = false; 35 private final Buffer m_buffer; 36 private final ObjectFactory m_factory; 37 38 public FixedSizePool( ObjectFactory factory, int size ) 39 throws Exception 40 { 41 m_buffer = new BoundedFifoBuffer( size ); 42 m_factory = factory; 43 44 for( int i = 0; i < size; i++ ) 45 { 46 m_buffer.add( newInstance() ); 47 } 48 } 49 50 public Object acquire() 51 { 52 if( m_disposed ) 53 { 54 throw new IllegalStateException ( "Cannot get an object from a disposed pool" ); 55 } 56 57 Object object = null; 58 59 synchronized( m_buffer ) 60 { 61 object = m_buffer.remove(); 62 } 63 64 return object; 65 } 66 67 public void release( Object object ) 68 { 69 if( m_disposed ) 70 { 71 try 72 { 73 m_factory.dispose( object ); 74 } 75 catch( Exception e ) 76 { 77 } 79 } 80 else 81 { 82 synchronized( m_buffer ) 83 { 84 m_buffer.add( PoolUtil.recycle( object ) ); 85 m_buffer.notifyAll(); 86 } 87 } 88 } 89 90 public Object newInstance() 91 throws Exception 92 { 93 return m_factory.newInstance(); 94 } 95 96 public void dispose() 97 { 98 m_disposed = true; 99 100 synchronized( m_buffer ) 101 { 102 while( !m_buffer.isEmpty() ) 103 { 104 try 105 { 106 m_factory.dispose( m_buffer.remove() ); 107 } 108 catch( Exception e ) 109 { 110 } 112 } 113 } 114 } 115 } 116 117 | Popular Tags |