一磕一碰

          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 一磕一碰 閱讀(190) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 临城县| 肇东市| 黔南| 鄯善县| 抚顺市| 水富县| 大冶市| 贡觉县| 屏东县| 大同市| 南昌县| 光泽县| 广元市| 台江县| 饶平县| 永善县| 康定县| 柳江县| 潜江市| 会昌县| 黄浦区| 岚皋县| 石棉县| 高唐县| 大名县| 松桃| 会东县| 巴塘县| 庆安县| 修文县| 霸州市| 湟源县| 化州市| 巴彦淖尔市| 曲阜市| 拉萨市| 龙井市| 即墨市| 古蔺县| 景泰县| 调兵山市|