JDK1.5中LOCK,Conditionの使用

2350 ワード

import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class LockTest10050 { public static void main(String[] args) { final Bussiness bussiness = new Bussiness(); new Thread(new Runnable() { public void run() { for (int i = 1; i < 51; i++) { bussiness.sub(i); } } }).start(); new Thread(new Runnable() { public void run() { for (int i = 1; i < 51; i++) { bussiness.main(i); } } }).start(); } } class Bussiness{Lock lock=new ReentrantLock();Condition condition=lock.newCondition();boolean flag=true;public void sub(int i){lock.lock();try{while(!flag)condition.await();for(int j=1;j<11;j+){System.out.println("サブスレッド第"+i+"サイクル:回数"+j);flag = false; condition.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } public void main(int i){lock.lock();try{while(flag)condition.await();for(int j=1;j<101;j+){System.out.println("プライマリスレッド第"+i+"セカンダリループ:回数"+j);}flag = true; condition.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } }
}
APIドキュメントのインスタンスコード:
 
class BoundedBuffer {

   final Lock lock = new ReentrantLock();

   final Condition notFull  = lock.newCondition(); 

   final Condition notEmpty = lock.newCondition(); 



   final Object[] items = new Object[100];

   int putptr, takeptr, count;



   public void put(Object x) throws InterruptedException {

     lock.lock();

     try {

       while (count == items.length) 

         notFull.await();

       items[putptr] = x; 

       if (++putptr == items.length) putptr = 0;

       ++count;

       notEmpty.signal();

     } finally {

       lock.unlock();

     }

   }



   public Object take() throws InterruptedException {

     lock.lock();

     try {

       while (count == 0) 

         notEmpty.await();

       Object x = items[takeptr]; 

       if (++takeptr == items.length) takeptr = 0;

       --count;

       notFull.signal();

       return x;

     } finally {

       lock.unlock();

     }

   } 

 }