posts - 66,comments - 41,trackbacks - 0

          復(fù)習(xí)多線程,一個(gè)經(jīng)典的實(shí)例:生產(chǎn)者消費(fèi)者問題:

          1.number表示產(chǎn)品編號(hào),flag表示現(xiàn)在應(yīng)該由誰(shuí)來操作.

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

          3.兩個(gè)線程類Producer和Consumer分別代表生產(chǎn)者與消費(fèi)者

          Java代碼
          1. package cn.luxsoft.javafirststep.Thread;  
          2.   
          3. class ProductData {  
          4.   
          5.     // 產(chǎn)品編號(hào)  
          6.     private int number;  
          7.   
          8.     // 標(biāo)記位  
          9.     private boolean flag = true;  
          10.   
          11.     public synchronized void setNumber(int number) {  
          12.         if (!flag) {  
          13.             try {  
          14.                 // 末消費(fèi)等待  
          15.                 wait();  
          16.             } catch (InterruptedException e) {  
          17.                 e.printStackTrace();  
          18.             }  
          19.         }  
          20.         this.number = number;  
          21.   
          22.         // 標(biāo)記已經(jīng)產(chǎn)生  
          23.         flag = false;  
          24.   
          25.         // 通知消費(fèi)者已經(jīng)生產(chǎn),可以消費(fèi)  
          26.         notify();  
          27.     }  
          28.   
          29.     public synchronized int getNumber() {  
          30.         if (flag) {  
          31.             try {  
          32.                 // 未生產(chǎn)等待  
          33.                 wait();  
          34.             } catch (InterruptedException e) {  
          35.                 e.printStackTrace();  
          36.             }  
          37.         }  
          38.   
          39.         // 標(biāo)記已消費(fèi)  
          40.         flag = true;  
          41.   
          42.         // 通知需要生產(chǎn)  
          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 + "]生產(chǎn).");  
          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 + "]消費(fè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) 評(píng)論(0)  編輯  收藏 所屬分類: J2SE
          主站蜘蛛池模板: 乐昌市| 来宾市| 抚顺县| 化隆| 新平| 徐州市| 永泰县| 西盟| 金华市| 涪陵区| 铁岭市| 台江县| 梅河口市| 南丹县| 九寨沟县| 策勒县| 体育| 广西| 白沙| 沙雅县| 察雅县| 嘉禾县| 江西省| 万荣县| 泗洪县| 海兴县| 额尔古纳市| 闸北区| 新沂市| 福贡县| 舞钢市| 湘西| 横峰县| 永济市| 桑日县| 长宁区| 临澧县| 曲靖市| 黔东| 肥乡县| 龙井市|