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

  • 相关阅读:
    C#中异步和多线程的区别
    猫 老鼠 人的编程题
    C#中数组、ArrayList和List三者的区别
    经典.net面试题目
    sql有几种删除表数据的方式
    内存池的实现
    A*算法为什么是最优的
    传教士与野人问题
    d3d导致cairo不正常
    c++中的signal机制
  • 原文地址:https://www.cnblogs.com/wucg/p/2663836.html
Copyright © 2020-2023  润新知