http://www.cnblogs.com/DreamDrive/p/6204665.html 这个是用Lock类实现的.
场景:
厨师类:
1 import java.util.List; 2 import java.util.Random; 3 import java.util.concurrent.TimeUnit; 4 5 public class Cook implements Runnable { 6 7 private List<Food> foods; 8 private static int num = 1; 9 private static final int MAXSIZE = 1; 10 11 public List<Food> getFoods() { 12 return foods; 13 } 14 15 public void setFoods(List<Food> foods) { 16 this.foods = foods; 17 } 18 19 public Cook(List<Food> foods) { 20 this.foods = foods; 21 } 22 23 public Cook() { 24 } 25 26 public void produce() { 27 while (true) { 28 synchronized (SaleWindow.class) { 29 if (foods.size() < MAXSIZE) {//卖饭的桌子上饭总有 一定的容量限制. 30 Food food = new Food((num++) + ""); 31 foods.add(food); 32 System.out.println(Thread.currentThread().getName() 33 + " :做好 " + food.getId() + " 号饭了"); 34 Random ran = new Random(); 35 int i = ran.nextInt(300); 36 try { 37 TimeUnit.MILLISECONDS.sleep(i); 38 } catch (InterruptedException e) { 39 e.printStackTrace(); 40 } 41 42 //SaleWindow.class.notify(); 43 SaleWindow.class.notifyAll(); 44 } else { 45 System.out.println(Thread.currentThread().getName() 46 + " :桌子放满了。窗口赶紧卖,我休息了。。。"); 47 48 try { 49 SaleWindow.class.wait(); 50 } catch (InterruptedException e) { 51 e.printStackTrace(); 52 } 53 } 54 } 55 } 56 } 57 58 @Override 59 public void run() { 60 produce(); 61 } 62 }
食物类:
1 public class Food { 2 3 private String id; 4 5 6 public Food(String id) { 7 this.id = id; 8 } 9 10 public String getId() { 11 return id; 12 } 13 14 public void setId(String id) { 15 this.id = id; 16 } 17 18 19 }
卖饭窗口类:
1 import java.util.List; 2 import java.util.Random; 3 import java.util.concurrent.TimeUnit; 4 5 public class SaleWindow implements Runnable { 6 7 private List<Food> foods; 8 9 public List<Food> getFoods() { 10 return foods; 11 } 12 13 public void setFoods(List<Food> foods) { 14 this.foods = foods; 15 } 16 17 public SaleWindow(List<Food> foods) { 18 this.foods = foods; 19 } 20 21 public SaleWindow() { 22 } 23 24 public void sale() { 25 while (true) { 26 synchronized (SaleWindow.class) { 27 if (foods.size() > 0) { 28 try { 29 Food food = foods.get(0); 30 System.out.println(Thread.currentThread().getName() 31 + ": 卖出了 " + food.getId() + " 号饭..."); 32 Random ran = new Random(); 33 int i = ran.nextInt(300); 34 35 TimeUnit.MILLISECONDS.sleep(i); 36 foods.remove(0); 37 //SaleWindow.class.notify();//随机唤醒一条等待的线程 38 SaleWindow.class.notifyAll();//唤醒所有等待的线程 39 } catch (InterruptedException e) { 40 e.printStackTrace(); 41 } 42 }else{ 43 System.out.println(Thread.currentThread().getName()+":饭买完了。厨师赶紧做,我休息了。。。"); 44 try { 45 SaleWindow.class.wait(); 46 } catch (InterruptedException e) { 47 e.printStackTrace(); 48 } 49 50 } 51 } 52 } 53 } 54 55 @Override 56 public void run() { 57 sale(); 58 } 59 60 }
测试类:
1 import java.util.ArrayList; 2 import java.util.List; 3 4 public class Test { 5 6 public static void main(String[] args) { 7 8 List<Food> foods = new ArrayList<Food>(); 9 for (int i = 0; i < 4; i++) {//4个厨师 生产 10 new Thread(new Cook(foods),"Cook"+(i+1)).start(); 11 } 12 for (int i = 0; i < 3; i++) {//3个窗口 消费 13 new Thread(new SaleWindow(foods),"sale"+(i+1)).start(); 14 } 15 } 16 }