zoukankan      html  css  js  c++  java
  • Producer & Consumer 生产者、消费者

    //Meal.java
    package producer.consumer.demo;
    
    public class Meal {
        private final int orderNum;
    
        public Meal(int orderNum) {
    	this.orderNum = orderNum;
        }
    
        public String toString() {
    	return "Meal " + orderNum;
        }
    }
    
    //Chef.java
    package producer.consumer.demo;
    
    import java.util.concurrent.TimeUnit;
    
    public class Chef implements Runnable{
        private Restaurant restaurant;
        private int count = 0;
    
        public Chef(Restaurant r) {
    	restaurant = r;
        }
    
        public void run() {
    	try {
    	    while (!Thread.interrupted()) {
    		synchronized (this) {
    		    while (restaurant.meal != null)
    			wait(); // ... for the meal to be taken
    		}
    		if (++count == 10) {
    		    System.out.println("Out of food, closing");
    		    restaurant.exec.shutdownNow();
    		}
    		System.out.println("Order up! ");
    		synchronized (restaurant.waitPerson) {
    		    restaurant.meal = new Meal(count);
    		    restaurant.waitPerson.notifyAll();
    		}
    		TimeUnit.MILLISECONDS.sleep(100);
    	    }
    	} catch (InterruptedException e) {
    	    System.out.println("Chef interrupted");
    	}
        }
    }
    
    //WaitPerson.java
    package producer.consumer.demo;
    
    public class WaitPerson implements Runnable{
        private Restaurant restaurant;
    
        public WaitPerson(Restaurant r) {
    	restaurant = r;
        }
    
        public void run() {
    	try {
    	    while (!Thread.interrupted()) {
    		synchronized (this) {
    		    while (restaurant.meal == null)
    			wait(); // ... for the chef to produce a meal
    		}
    		System.out.println("Waitperson got " + restaurant.meal);
    		synchronized (restaurant.chef) {
    		    restaurant.meal = null;
    		    restaurant.chef.notifyAll(); // Ready for another
    		}
    	    }
    	} catch (InterruptedException e) {
    	    System.out.println("WaitPerson interrupted");
    	}
        }
    }
    
    //Restaurant.java
    package producer.consumer.demo;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class Restaurant {
        Meal meal;
        ExecutorService exec = Executors.newCachedThreadPool();
        WaitPerson waitPerson = new WaitPerson(this);
        Chef chef = new Chef(this);
    
        public Restaurant() {
    	exec.execute(chef);
    	exec.execute(waitPerson);
        }
    
        public static void main(String[] args) {
    	new Restaurant();
        }
    }
    

      

    from: Thinking in Java.

  • 相关阅读:
    正则匹配 去掉 多余的js和html标签
    把url后面的.html去掉
    lnmp下配置虚拟主机
    lnmp 下安装yaf
    yaf运行错误:Class 'Yaf_Application' not found
    项目中表中每条数据的序号显示自增的方法
    tp中让头疼似懂非懂的create
    2015.1写留言板的时用的 知识点和函数 --->总结
    环境搭建
    ercharts api
  • 原文地址:https://www.cnblogs.com/wucg/p/2663836.html
Copyright © 2011-2022 走看看