package joshua.discriminative.training.parallel; import java.util.List; import java.util.concurrent.BlockingQueue; import java.util.logging.Logger; /**This implements the "one-producer, multiple consumers" model. * */ /**parameterized by three classes*/ public final class ProducerConsumerModel<O extends Object, P extends Producer<O>, C extends Consumer<O>> { BlockingQueue<O> queue; P producer; List<C> consumers; int numConsumers; /** Logger for this class. */ private static final Logger logger = Logger.getLogger(ProducerConsumerModel.class.getName()); public ProducerConsumerModel(BlockingQueue<O> queue_, P producer_, List<C> consumers_){ queue = queue_; producer = producer_; consumers = consumers_; numConsumers = consumers.size(); if(numConsumers<=0){ logger.severe("has zero consumers, must be wrong!"); System.exit(0); }else{ //logger.info("=======numConsumers="+numConsumers); } } public void runParallel(){ //== start all the threads producer.start(); for(C c : consumers){ c.start(); } //== wait for all threads end try { producer.join(); for(Thread c : consumers){ c.join(); } } catch (InterruptedException ex){ //TODO } } }