把困難踩在腳下

          迎難而上

           

          模擬生產(chǎn)零件系統(tǒng)程序

          要求:機(jī)器生產(chǎn)零件,工人取走零件,機(jī)器先生產(chǎn)一個(gè)1號(hào)零件,工人取走一個(gè)1號(hào)零件,機(jī)器再生產(chǎn)一個(gè)2號(hào)零件,工人再取走,然后機(jī)器生產(chǎn)一個(gè)1號(hào)零件,工人取走,機(jī)器再生產(chǎn)一個(gè)2號(hào)零件,工人取走,就這樣依次交替。在機(jī)器生產(chǎn)零件的時(shí)候,工人禁止取零件;在工人取零件的時(shí)候,機(jī)器禁止生產(chǎn)零件。

          生產(chǎn)狀態(tài)圖如下:

          1

          程序代碼如下:

           

          package com.dr.runnable3;
          //零件類(lèi)
          class LingJian
          {
              
          private int num=1;
              
          private String name="車(chē)輪";
              
          /*
               * falg=true;表示機(jī)器正在生產(chǎn)零件,否則表示工人正在取零件
               
          */

              
          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 {
                          
          //工人在取零件,機(jī)器暫停工作
                          wait();
                          System.out.println(
          "工人正在取零件,等會(huì)在生產(chǎn)");
                          Thread.sleep(
          1000);
                      }
           catch (InterruptedException e) {
                          e.printStackTrace();
                      }

                  }

                  
          //機(jī)器生產(chǎn)零件
                  this.setNum(num);
                  
          this.setName(name);
                  
          //修改標(biāo)志位,使工人開(kāi)始工作
                  flag=false;
                  
          //喚醒等待的線(xiàn)程
                  notify();
              }

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

                  }

                  
          //工人取零件,機(jī)器休息
                  System.out.println("零件號(hào): "+this.getNum()+"--->零件名稱(chēng): "+this.getName());
                  
          //修改標(biāo)志位,使機(jī)器開(kāi)始工作
                  flag=true;
                  
          //喚醒等待的線(xiàn)程
                  notify();
              }

          }
           

          //生產(chǎn)零件
          class Produce implements Runnable//機(jī)器
          {
              
          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,"車(chē)輪");
                          i
          =1;
                      }

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

                  }

              }

          }
           

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

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

              }

          }
           

          //測(cè)試類(lèi)
          public class LingJianDemo {
              
          public static void main(String args[])
              
          {
                  
          //構(gòu)建一個(gè)零件實(shí)例對(duì)象
                  LingJian lj=new LingJian();
                  Produce pro
          =new Produce(lj);
                  Consume cse
          =new Consume(lj);
                  
          new Thread(cse).start();
                  
          new Thread(pro).start();
              }
           

          }
           

          此程序的輸出結(jié)果如圖:

          2

          這個(gè)程序涉及到并發(fā)多線(xiàn)程,多個(gè)線(xiàn)程共享一個(gè)資源,如果每個(gè)線(xiàn)程在同一時(shí)間同時(shí)修改這個(gè)資源那么勢(shì)必會(huì)造成資源信息的不正確,為了防止這種情況發(fā)生,我們?cè)诖顺绦蛑卸x了兩個(gè)同步方法來(lái)給這個(gè)資源加上一把鎖,在一個(gè)時(shí)間點(diǎn)上只能有一個(gè)線(xiàn)程使用這個(gè)資源,其他線(xiàn)程等待。

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


          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

          統(tǒng)計(jì)

          公告

          快樂(lè)每一天!

          Everything is an object!

          常用鏈接

          留言簿(2)

          隨筆檔案

          學(xué)習(xí)網(wǎng)站

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 天水市| 盐池县| 丽水市| 麻栗坡县| 石阡县| 富锦市| 宁国市| 温宿县| 绥芬河市| 聊城市| 巴中市| 敦煌市| 永靖县| 都兰县| 仁寿县| 呼图壁县| 行唐县| 南投县| 都江堰市| 岐山县| 临武县| 浦北县| 交城县| 高阳县| 波密县| 武宁县| 顺平县| 阳山县| 怀安县| 金乡县| 深水埗区| 武穴市| 东丽区| 鹰潭市| 桑日县| 玛纳斯县| 楚雄市| 波密县| 班戈县| 上犹县| 日照市|