• 线程中消费者生产者的实例代码(synchronized关键字)


    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 }
  • 相关阅读:
    ACM-ICPC 2018 徐州赛区网络预赛 I. Characters with Hash
    hdu 5437
    poj 1502
    ACM-ICPC 2018 沈阳赛区网络预赛 K. Supreme Number
    ACM-ICPC 2018 沈阳赛区网络预赛 F. Fantastic Graph
    ACM-ICPC 2018 南京赛区网络预赛 B. The writing on the wall
    ACM-ICPC 2018 南京赛区网络预赛 J. Sum
    法里数列
    ACM-ICPC 2018 南京赛区网络预赛 L. Magical Girl Haze
    Hashtable 为什么不叫 HashTable?
  • 原文地址:https://www.cnblogs.com/DreamDrive/p/6192685.html
Copyright © 2020-2023  润新知