並列分散ソフトウェア 電子・情報工学系 新城 靖 <yas@is.tsukuba.ac.jp>
このページは、次の URL にあります。
http://www.hlla.is.tsukuba.ac.jp/~yas/sie/pdsoft-2001/2002-01-17
cirq-buffer-java.html
あるいは、次のページから手繰っていくこともできます。
http://www.hlla.is.tsukuba.ac.jp/~yas/sie/
http://www.is.tsukuba.ac.jp/~yas/index-j.html
http://www.hlla.is.tsukuba.ac.jp/~yas/index-j.html
---------------------------------------------------------------------- 1: 2: /* 3: * CircularBuffer.java -- Java による環状バッファ 4: * このファイルは次の場所にあります。 5: * http://www.hlla.is.tsukuba.ac.jp/~yas/sie/pdsoft-2001/examples/CircularBuffer.java 6: * wget コマンドでコピーできます。 7: * Start: 2002/01/17 01:09:36 8: */ 9: 10: class CircularBuffer 11: { 12: static final int BUFFER_SIZE = 4 ; 13: int rp ; // 読み出す位置 14: int wp ; // 書き込む位置 15: int data[]; // データを保存する場所 16: int used ; // バッファ内の要素数 17: CircularBuffer() 18: { 19: data = new int[BUFFER_SIZE]; 20: rp = 0 ; 21: wp = 0 ; 22: } 23: 24: public synchronized void put( int x ) throws InterruptedException 25: { 26: while( used == data.length ) 27: wait(); 28: data[ wp++ ] = x ; 29: if( wp == data.length ) 30: wp = 0 ; 31: if( used++ == 0 ) 32: notifyAll(); 33: } 34: 35: public synchronized int get() throws InterruptedException 36: { 37: int x ; 38: while( used == 0 ) 39: wait(); 40: x = data[ rp++ ] ; 41: if( rp >= data.length ) 42: rp = 0 ; 43: if( used-- == data.length ) 44: notifyAll(); 45: return( x ); 46: } 47: 48: static void thread_A( CircularBuffer b ) // Producer 49: { 50: int i,x ; 51: try { 52: for( i = 0 ; i<10 ; i++ ) 53: { 54: x = i ; 55: System.out.println("thread_A(): put( "+x+" )"); 56: b.put( x ); 57: } 58: } 59: catch( InterruptedException e ) 60: { 61: System.err.println("thread_A(): Interrupted"); 62: } 63: } 64: 65: static void thread_B( CircularBuffer b ) // Consumer 66: { 67: int i, x ; 68: try { 69: for( i = 0 ; i<10 ; i++ ) 70: { 71: x = b.get(); 72: System.out.println("thread_B(): get() "+x+"."); 73: } 74: } 75: catch( InterruptedException e ) 76: { 77: System.err.println("thread_B(): Interrupted"); 78: } 79: } 80: 81: static void main(String argv[]) 82: { 83: final CircularBuffer b = new CircularBuffer(); 84: Thread t1 = new Thread( new Runnable() 85: { public void run() {thread_A(b);} } ); 86: t1.start(); 87: Thread t2 = new Thread( new Runnable() 88: { public void run() {thread_B(b);} } ); 89: t2.start(); 90: try { 91: t1.join(); 92: t2.join(); 93: } 94: catch( InterruptedException e ) 95: { 96: System.err.println("main(): Interrupted"); 97: } 98: } 99: } ----------------------------------------------------------------------