隨筆-95  評論-31  文章-10  trackbacks-0
           1public class MyStack {
           2    private int[] a;
           3    private int count = 0;
           4    public final int MAX_SIZE;
           5
           6    public MyStack(int size) {
           7        MAX_SIZE = size;
           8        a = new int[size];
           9        count = 0;
          10    }

          11
          12    public synchronized void push() {
          13         while(count==MAX_SIZE){//這里用while而不是if因為當(dāng)被喚醒時,該線程處于鎖池等待獲取鎖,這個時候可能會有別的該線改變數(shù)組的大小。所以喚醒時繼續(xù)檢查數(shù)組是否已滿。
          14             try {
          15                this.wait(); //釋放掉當(dāng)前的對象鎖,在等待池等待
          16            }
           catch (InterruptedException e) {
          17                e.printStackTrace();
          18            }

          19         }

          20         a[count++]=count;
          21         System.out.println(Thread.currentThread().getName()+"壓入數(shù)據(jù):"+count);
          22         this.notify();  //喚醒生產(chǎn)者消費者線程
          23    }

          24
          25    public synchronized int pop() {
          26             while(count ==0){
          27                 try {
          28                    this.wait();
          29                }
           catch (InterruptedException e) {
          30                    e.printStackTrace();
          31                }

          32             }

          33             this.notify();
          34             System.out.println(Thread.currentThread().getName()+"彈出數(shù)據(jù):"+count);
          35             return a[--count];
          36     }

          37}

          38/**
          39 *生產(chǎn)者
          40 **/

          41public class Producer extends Thread {
          42
          43    private MyStack stack;
          44    
          45    public Producer(MyStack stack){
          46        this.stack = stack;
          47    }

          48    @Override
          49    public void run() {
          50        while (true{
          51            stack.push();
          52            try {
          53                Thread.sleep(200);
          54            }
           catch (InterruptedException e) {
          55                e.printStackTrace();
          56            }

          57        }

          58    }

          59}

          60/**
          61 *消費者
          62 **/

          63public class Consumer extends Thread{
          64             
          65    private MyStack stack;
          66    
          67    public Consumer(MyStack stack){
          68        this.stack = stack;
          69    }

          70    
          71    @Override
          72    public void run() {
          73        while(true){
          74            stack.pop();
          75            try {
          76                Thread.sleep(300);
          77            }
           catch (InterruptedException e) {
          78                e.printStackTrace();
          79            }

          80        }

          81    }

          82}

          線程狀態(tài)圖
          posted on 2010-08-19 10:19 朔望魔刃 閱讀(239) 評論(0)  編輯  收藏 所屬分類: java
          主站蜘蛛池模板: 周至县| 上饶市| 成都市| 双牌县| 凤阳县| 吉安市| 新河县| 东明县| 班戈县| 科技| 密云县| 邳州市| 怀远县| 靖西县| 达孜县| 黄冈市| 眉山市| 濮阳县| 平邑县| 南宫市| 汾阳市| 台南市| 凭祥市| 东乌珠穆沁旗| 灵丘县| 喜德县| 湘潭县| 晋城| 德格县| 江陵县| 普洱| 康平县| 黎川县| 游戏| 靖江市| 孟津县| 惠水县| 兴仁县| 泽库县| 疏勒县| 普兰店市|