把困難踩在腳下

          迎難而上

           

          模擬生產零件系統程序

          要求:機器生產零件,工人取走零件,機器先生產一個1號零件,工人取走一個1號零件,機器再生產一個2號零件,工人再取走,然后機器生產一個1號零件,工人取走,機器再生產一個2號零件,工人取走,就這樣依次交替。在機器生產零件的時候,工人禁止取零件;在工人取零件的時候,機器禁止生產零件。

          生產狀態圖如下:

          1

          程序代碼如下:

           

          package com.dr.runnable3;
          //零件類
          class LingJian
          {
              
          private int num=1;
              
          private String name="車輪";
              
          /*
               * falg=true;表示機器正在生產零件,否則表示工人正在取零件
               
          */

              
          private boolean flag=true;
              
          public int getNum() {
                  
          return num;
              }

              
          public void setNum(int num) {
                  
          this.num = num;
              }

              
          public String getName() {
                  
          return name;
              }

              
          public void setName(String name) {
                  
          this.name = name;
              }

              
          public synchronized void set(int num,String name)
              
          {
                  
          if(!flag)
                  
          {
                      
          try {
                          
          //工人在取零件,機器暫停工作
                          wait();
                          System.out.println(
          "工人正在取零件,等會在生產");
                          Thread.sleep(
          1000);
                      }
           catch (InterruptedException e) {
                          e.printStackTrace();
                      }

                  }

                  
          //機器生產零件
                  this.setNum(num);
                  
          this.setName(name);
                  
          //修改標志位,使工人開始工作
                  flag=false;
                  
          //喚醒等待的線程
                  notify();
              }

              
          public synchronized void get()
              
          {
                  
          if(flag)
                  
          {
                      
          try {
                          
          //flag=true;機器正在生產零件,工人先休息會
                          System.out.println("機器正在生產零件,請稍等");
                          wait();
                          Thread.sleep(
          1000);
                      }
           catch (InterruptedException e) {
                          e.printStackTrace();
                      }

                  }

                  
          //工人取零件,機器休息
                  System.out.println("零件號: "+this.getNum()+"--->零件名稱: "+this.getName());
                  
          //修改標志位,使機器開始工作
                  flag=true;
                  
          //喚醒等待的線程
                  notify();
              }

          }
           

          //生產零件
          class Produce implements Runnable//機器
          {
              
          private LingJian lj=null;
              
          public Produce(LingJian lj)
              
          {
                  
          this.lj=lj;
              }

              
          public void run()
              
          {
                  
          int i=0;
                  
          while(true)
                  
          {
                      
          if(i==0)
                      
          {
                          lj.set(
          1,"車輪");
                          i
          =1;
                      }

                      
          if(i==1)
                      
          {
                          lj.set(
          2,"車軸");
                          i
          =0;
                      }

                  }

              }

          }
           

          //工人取零件
          class Consume implements Runnable//工人
          {
              
          private LingJian lj=null;
              
          public Consume(LingJian lj)
              
          {
                  
          this.lj=lj;
              }

              
          public void run()
              
          {
                  
          while(true)
                  
          {
                      lj.get();
                  }

              }

          }
           

          //測試類
          public class LingJianDemo {
              
          public static void main(String args[])
              
          {
                  
          //構建一個零件實例對象
                  LingJian lj=new LingJian();
                  Produce pro
          =new Produce(lj);
                  Consume cse
          =new Consume(lj);
                  
          new Thread(cse).start();
                  
          new Thread(pro).start();
              }
           

          }
           

          此程序的輸出結果如圖:

          2

          這個程序涉及到并發多線程,多個線程共享一個資源,如果每個線程在同一時間同時修改這個資源那么勢必會造成資源信息的不正確,為了防止這種情況發生,我們在此程序中定義了兩個同步方法來給這個資源加上一把鎖,在一個時間點上只能有一個線程使用這個資源,其他線程等待。

          posted on 2010-11-09 11:51 馮魁 閱讀(220) 評論(0)  編輯  收藏


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


          網站導航:
           

          導航

          統計

          公告

          快樂每一天!

          Everything is an object!

          常用鏈接

          留言簿(2)

          隨筆檔案

          學習網站

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 临漳县| 阳新县| 新津县| 鱼台县| 鄂托克旗| 平定县| 廉江市| 保山市| 贡觉县| 邻水| 榆林市| 石台县| 农安县| 景宁| 遵义县| 长泰县| 太仆寺旗| 手游| 呼和浩特市| 台东市| 汕头市| 宁城县| 河间市| 孝昌县| 清镇市| 东城区| 肃宁县| 呼玛县| 茌平县| 皋兰县| 祥云县| 台北市| 松阳县| 桐柏县| 平塘县| 富民县| 池州市| 临猗县| 鄂温| 高州市| 白城市|