• 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.

  • 相关阅读:
    ubuntu 14.4 apache2 django
    github上的版本和本地版本冲突的解决方法
    Javascript能做什么 不能做什么。
    django 取model字段的verbose_name值
    Django在admin模块中显示auto_now_add=True或auto_now=True的时间类型列
    合并多个python list以及合并多个 django QuerySet 的方法
    摘抄
    Python 字符串拼接
    学习HTTP
    Django 自定义模板标签和过滤器
  • 原文地址:https://www.cnblogs.com/wucg/p/2663836.html
Copyright © 2020-2023  润新知