一磕一碰

          js/java

          統計

          留言簿

          閱讀排行榜

          評論排行榜

          通過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 on 2012-12-04 10:06 一磕一碰 閱讀(190) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 东方市| 宣汉县| 易门县| 陵川县| 虎林市| 安龙县| 涿州市| 莒南县| 敦煌市| 通州区| 青阳县| 紫金县| 东安县| 康马县| 芒康县| 琼结县| 犍为县| 鄄城县| 绥棱县| 军事| 崇州市| 胶南市| 元氏县| 岳阳县| 双城市| 吴桥县| 汉源县| 东台市| 成都市| 吉木乃县| 福州市| 白玉县| 万荣县| 奇台县| 淳安县| 西峡县| 荔波县| 周至县| 咸阳市| 隆德县| 大宁县|