    001package com.hammurapi.common.concurrent;
    002
    003
    004/**
    005 * This class increments counter when created and
    006 * decrements when run() method exits. When counter reaches zero, this
    007 * class invokes notifyAll() on the counter. The class shall be used for
    008 * parallel execution of tasks when it is required to wait until all tasks
    009 * complete.
    010 * @author Pavel Vlasov
    011 *
    012 */
    013public class CountedRunnable implements Runnable {
    014
    015        /**
    016         * Counter to use with CounterRunnable.
    017         * @author Pavel Vlasov
    018         */
    019        public static class Counter {
    020                private int counter;
    021
    022                synchronized void inc() {
    023                        ++counter;
    024                }
    025
    026                synchronized void dec() {
    027                        if (--counter <= 0) {
    028                                notifyAll();
    029                        }
    030                }
    031
    032                public synchronized void join() throws InterruptedException {
    033                        while (counter>0) {
    034                                wait();
    035                        }
    036                }
    037        }
    038
    039        private Counter counter;
    040        private Runnable master;
    041
    042        public CountedRunnable(Counter counter, Runnable master) {
    043                this.counter = counter;
    044                counter.inc();
    045                this.master = master;
    046        }
    047
    048        final public void run() {
    049                try {
    050                        master.run();
    051                } finally {
    052                        counter.dec();
    053                }
    054        }
    055
    056}