-
package test.java.util.concurrent;
-
-
import java.util.concurrent.ExecutorService;
-
import java.util.concurrent.Executors;
-
import java.util.concurrent.TimeUnit;
-
-
class Meal {
-
private final int orderNum;
-
-
public Meal(int orderNum) {
-
this.orderNum = orderNum;
-
}
-
-
public String toString() {
-
return \"Meal \" + orderNum;
-
}
-
}
-
-
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();//...wait 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\");
-
}
-
}
-
}
-
-
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\");
-
}
-
}
-
}
-
-
-
public class Restaurant {
-
Meal meal;
-
WaitPerson waitPerson = new WaitPerson(this);
-
Chef chef = new Chef(this);
-
ExecutorService exec = Executors.newCachedThreadPool();
-
-
public Restaurant() {
-
exec.execute(chef);
-
exec.execute(waitPerson);
-
}
-
-
public static void main(String[] args) {
-
new Restaurant();
-
}
-
}
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28912557/viewspace-1143088/
,如需转载,请注明出处,否则将追究法律责任。