posts - 66,comments - 41,trackbacks - 0

          復習多線程,一個經典的實例:生產者消費者問題:

          1.number表示產品編號,flag表示現在應該由誰來操作.

          2.ProcuctData類中有兩個同步方法setNumber()和getNumber(),分別代表生產者生產產品和消費者消費 產品。

          3.兩個線程類Producer和Consumer分別代表生產者與消費者

          Java代碼
          1. package cn.luxsoft.javafirststep.Thread;  
          2.   
          3. class ProductData {  
          4.   
          5.     // 產品編號  
          6.     private int number;  
          7.   
          8.     // 標記位  
          9.     private boolean flag = true;  
          10.   
          11.     public synchronized void setNumber(int number) {  
          12.         if (!flag) {  
          13.             try {  
          14.                 // 末消費等待  
          15.                 wait();  
          16.             } catch (InterruptedException e) {  
          17.                 e.printStackTrace();  
          18.             }  
          19.         }  
          20.         this.number = number;  
          21.   
          22.         // 標記已經產生  
          23.         flag = false;  
          24.   
          25.         // 通知消費者已經生產,可以消費  
          26.         notify();  
          27.     }  
          28.   
          29.     public synchronized int getNumber() {  
          30.         if (flag) {  
          31.             try {  
          32.                 // 未生產等待  
          33.                 wait();  
          34.             } catch (InterruptedException e) {  
          35.                 e.printStackTrace();  
          36.             }  
          37.         }  
          38.   
          39.         // 標記已消費  
          40.         flag = true;  
          41.   
          42.         // 通知需要生產  
          43.         notify();  
          44.         return this.number;  
          45.     }  
          46. }  
          47.   
          48. class Procucer extends Thread {  
          49.     private ProductData s;  
          50.   
          51.     Procucer(ProductData s) {  
          52.         this.s = s;  
          53.     }  
          54.   
          55.     @Override  
          56.     public void run() {  
          57.         for (int i = 0; i < 10; i++) {  
          58.             s.setNumber(i);  
          59.             System.out.println("P[" + i + "]生產.");  
          60.         }  
          61.     }  
          62. }  
          63.   
          64. class Consumer extends Thread {  
          65.     private ProductData s;  
          66.   
          67.     Consumer(ProductData s) {  
          68.         this.s = s;  
          69.     }  
          70.   
          71.     public void run() {  
          72.         int i;  
          73.   
          74.         do {  
          75.             i = s.getNumber();  
          76.             System.out.println("P[" + i + "]消費.**");  
          77.         } while (i != 9);  
          78.     }  
          79. }  
          80.   
          81. public class ProducerConsumer {  
          82.   
          83.     /** 
          84.      * @param args 
          85.      */  
          86.   
          87.     public static void main(String[] args) {  
          88.   
          89.         ProductData s = new ProductData();  
          90.         Thread producer = new Procucer(s);  
          91.         Thread consumer = new Consumer(s);  
          92.   
          93.         producer.start();  
          94.         consumer.start();  
          95.     }  
          96.   
          97. }  

          文章來源:http://www.my1984.net/?action=show&id=177

          MSN:
          posted on 2009-03-08 17:12 kylixlu 閱讀(793) 評論(0)  編輯  收藏 所屬分類: J2SE
          主站蜘蛛池模板: 焉耆| 建水县| 长阳| 武宣县| 苍山县| 平阳县| 北安市| 咸宁市| 新平| 枞阳县| 镇雄县| 洞头县| 栖霞市| 大姚县| 沿河| 台湾省| 繁峙县| 苏尼特左旗| 彭山县| 甘泉县| 彝良县| 花垣县| 营山县| 桐柏县| 彰武县| 巴林右旗| 大名县| 景宁| 开平市| 家居| 萨嘎县| 五寨县| 涪陵区| 山西省| 松滋市| 达拉特旗| 长葛市| 金昌市| 巴林右旗| 奉节县| 陆良县|