/*** Book: Thinking in Java * Features: producer and Consumer: * Please consider such a person hotel, it has a chef and a waiter. The waiter must wait for the cook to prepare the meal. When the chef is ready, he notifies the waiter, then the waiter will serve, then return to wait. * File: restaurant.java* time: May 8, 2015 18:23:01* Author: cutter_point*/package Lesson21concurency;import Java.util.concurrent.executorservice;import Java.util.concurrent.executors;import Java.util.concurrent.TimeUnit; Import static Net.mindview.util.print.*;class meal//meal class {Private final int ordernum;//order number public Meal (int ordernum) { This.ordernum = Ordernum; }//initialization, the number of meals public String toString () {return "Meal" + This.ordernum;}} Guest Human class Waitperson implements Runnable{private Restaurant restaurant;//a restaurant class public Waitperson (Restaurant R) { Restaurant = R; }//constructor, where is the restaurant you are going to? @Overridepublic void Run () {//For a guest, it is waiting for his food try{while (! Thread.interrupted ())///As long as the thread is not interrupted {synchronized (this)//when the guest is taken this thread {while (restaurant.meal = = null)// No food. this.wait (); Wait for the chef to do the food}print ("Guests get" + restaurant.meal);//Guests get food, ready to eat synchronized (restaurant.chef) {restaurant.meal = null;// The food is finished restaurant.chef.noTifyall (); The food is sold out, the chef wakes up to make food}}} catch (Interruptedexception e) {print ("The guest has no food to eat, gone!") ");}}} Class Chef implements Runnable{private Restaurant restaurant;//chef's Restaurant private int count = 0;public Chef (Restaurant Restau rant) {this.restaurant = restaurant;} @Overridepublic void Run () {//First thread cannot be interrupted try{while (! Thread.interrupted ()) {///when the thread is not interrupted synchronized (this)//locks the block and cannot execute {while (restaurant.meal! = null) When no lock is obtained for the current object This.wait ();//thread into wait, as long as there is food, then you have to wait for}//when called 10 times, then said the food finished, close if (++count = =) {print ("food sold out, closed");//stop thread// Restaurant.exec.shutdown (); Restaurant.exec.shutdownNow ();//This function is to send interrupt interrupt request to all tasks initiated by Executorservice} PRINTNB ("Serve the dishes!" ");//When not called 10 times, there is food synchronized (Restaurant.waitperson)//When the thread gets the guest object in this restaurant {restaurant.meal = new meal (count) ;//production of count sets of food restaurant.waitPerson.notifyAll (); Wake up the guests, can start eating}timeunit.milliseconds.sleep (100); Break 100 Msec}} catch (Interruptedexception e) {print ("The chef was fired!") ");}}} Restaurant class public class restaurant{//restaurant food, guest, waiter meal meal;//thread connection pool Executorservice exec = ExecutorS.newcachedthreadpool (); Waitperson Waitperson = new Waitperson (this); Chef chef = new Chef (this);//good, food has, the guests have, the chef also has, this restaurant does not rub much can work//create a restaurant, put into operation public Restaurant () {//With thread connection pool, Work together with these three threads Exec.execute (chef); Chef put into work exec.execute (Waitperson); The guest}public static void Main (string[] args) {new Restaurant ();//Put in a restaurant}}
Output:
Serve the dishes! -obj2 Guest got Meal 1 obj1
Serve the dishes! -obj2 Guest got Meal 2 obj1
Serve the dishes! -obj2 Guest got Meal 3 obj1
Serve the dishes! -obj2 Guest got Meal 4 obj1
Serve the dishes! -obj2 Guest got Meal 5 obj1
Serve the dishes! -obj2 Guest got Meal 6 obj1
Serve the dishes! -obj2 Guest got Meal 7 obj1
Serve the dishes! -obj2 Guest got Meal 8 obj1
Serve the dishes! -obj2 Guest got Meal 9 obj1
The food is sold out and the obj1 shut.
Serve the dishes! -obj2 the guest had no food to eat, went away! Obj1
The chef is fired! Obj1
"Thinkinginjava" 62, producers and consumers