java併発ツールバッグ-Condation


1.conditionを使って生産者-消費者モードを作る
  • CondationとLockを組み合わせて使う.conditionは、lock.newCondition();を使用してconditionを作成しなければならない.
  • とwaitnotify似ています必要な要求も同じです.ロックに保管しなければなりません.異常がないように投げます.
  • /**
     *   Condition    -     .
     */
    public class ConditionDemo {
        private static final Lock lock = new ReentrantLock();
    
        //    lock   condition.
        private static final Condition condition = lock.newCondition();
    
        private static int data = 0;
    
        private static final AtomicBoolean noUseData = new AtomicBoolean(false);
    
        public static void main(String[] args) {        
        	IntStream.rangeClosed(1, 10).forEach(item -> {
                new Thread(ConditionDemo::createData).start();
            });
    
            IntStream.rangeClosed(1, 10).forEach(item -> {           
            	 new Thread(ConditionDemo::useData).start();
            });
        }
        
        private static void createData() {
            try {
                lock.lock();
                while (noUseData.get()) {                
                	condition.await();
                }
                
                TimeUnit.SECONDS.sleep(2);
                data++;
                System.out.println(Thread.currentThread().getName() + " - P -> " + data);
                noUseData.set(true);
                condition.signalAll();
            } catch (InterruptedException e) {            
            	e.printStackTrace();
            } finally {            
            	lock.unlock();
            }    
        }
    
        private static void useData() {
            try {
                lock.lock();
                while (!noUseData.get()) {               
                	 condition.await();
                }
                
                TimeUnit.SECONDS.sleep(2);
                System.out.println(Thread.currentThread().getName() + " - C -> " + data);
                noUseData.set(false);
                condition.signalAll();
            } catch (InterruptedException e) {           
            	 e.printStackTrace();
            } finally {           
            	 lock.unlock();
            }    
       }
    }