一磕一碰

          js/java

          統計

          留言簿

          閱讀排行榜

          評論排行榜

          2012年12月4日 #

          通過wait和notify實現的生產者消費者demo

          Java代碼  :
          import java.util.ArrayList;  
          import java.util.List;  
          /** 
           * 通過wait和notify實現的生產者消費者demo 
           * User: zhangb 
           * Date: 12-12-1 
           * Time: 下午7:19 
           */  
          public class ProducerAndCustomerDemo {  
              private static int capacity = 150;  
              private static List<String> basket = new ArrayList<String>(capacity);  
            
              public static void main(String[] args) {  
                  // 多生產者與多消費者  
                  int producerSize = 2;  
                  Thread[] ps = new Thread[producerSize];  
                  for (int i = 0, step = 500; i < producerSize; i ++) {  
                      ps[i] = new Thread(new Producer((i) * step, (i+1) * step), "生產-->線程--" + (i+1));  
                      ps[i].start();  
                  }  
            
                  int customerSize = 10;  
                  Thread[] cs = new Thread[customerSize];  
                  for (int i = 0; i < customerSize; i ++) {  
                      cs[i] = new Thread(new Customer(), "消費線程--" + (i+1));  
                      cs[i].start();  
                  }  
            
                  // 等待生產線程結束并中斷消費線程  
                  for (int i = 0; i < producerSize; i ++) {  
                      try {  
                          ps[i].join();  
                      } catch (InterruptedException e) {  
                          e.printStackTrace();  
                      }  
                  }  
                  for (int i = 0; i < customerSize; i ++) {  
                      cs[i].interrupt();  
                  }  
              }  
              static class Producer implements Runnable {  
                  private int start;  
                  private int end;  
            
                  Producer(int start, int end) {  
                      this.start = start;  
                      this.end = end;  
                  }  
            
                  @Override  
                  public void run() {  
                      for (int i = start; i < end; i ++) {  
                          synchronized (basket) {  
                              try {  
                                  while (basket.size() == capacity) {  
                                      basket.wait();  
                                  }  
                                  String p = " PRO" + i;  
                                  System.out.println(Thread.currentThread().getName() + p);  
                                  basket.add(p);  
                                  basket.notifyAll();  
                                  Thread.yield(); // 讓出當前線程的執行權,有利于看出交替線程運行的效果  
                              } catch (InterruptedException e) {  
                                  e.printStackTrace();  
                                  break;  
                              }  
                          }  
                      }  
                  }  
              }  
              static class Customer implements Runnable {  
                  @Override  
                  public void run() {  
                      while (true) {  
                          synchronized (basket) {  
                              try{  
                                  while (basket.size() == 0) {  
                                      basket.wait();  
                                  }  
                                  System.out.println(Thread.currentThread().getName() + basket.remove(0));  
                                  basket.notifyAll();  
                              } catch (InterruptedException e) {  
                                  System.out.println(Thread.currentThread().getName() + "退出");  
                                  break;  
                              }  
                          }  
                      }  
                  }  
              }  
          }  

          posted @ 2012-12-04 10:06 一磕一碰 閱讀(188) | 評論 (0)編輯 收藏

          僅列出標題  
          主站蜘蛛池模板: 石景山区| 德阳市| 临沧市| 金坛市| 虎林市| 丽水市| 甘谷县| 庆元县| 雅江县| 邢台市| 扶绥县| 阜城县| 乡宁县| 邵阳县| 剑川县| 同仁县| 济宁市| 改则县| 荔浦县| 新津县| 肃宁县| 哈密市| 循化| 皋兰县| 札达县| 邵阳县| 绥化市| 哈密市| 新兴县| 当涂县| 文山县| 天台县| 加查县| 静乐县| 安顺市| 华亭县| 崇明县| 微山县| 贵定县| 景东| 新疆|