把困難踩在腳下

          迎難而上

           

          模擬生產(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;
          //零件類
          class LingJian
          {
              
          private int num=1;
              
          private String name="車輪";
              
          /*
               * 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)志位,使工人開始工作
                  flag=false;
                  
          //喚醒等待的線程
                  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()+"--->零件名稱: "+this.getName());
                  
          //修改標(biāo)志位,使機(jī)器開始工作
                  flag=true;
                  
          //喚醒等待的線程
                  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,"車輪");
                          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();
                  }

              }

          }
           

          //測(cè)試類
          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ā)多線程,多個(gè)線程共享一個(gè)資源,如果每個(gè)線程在同一時(shí)間同時(shí)修改這個(gè)資源那么勢(shì)必會(huì)造成資源信息的不正確,為了防止這種情況發(fā)生,我們?cè)诖顺绦蛑卸x了兩個(gè)同步方法來給這個(gè)資源加上一把鎖,在一個(gè)時(shí)間點(diǎn)上只能有一個(gè)線程使用這個(gè)資源,其他線程等待。

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


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


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

          導(dǎo)航

          統(tǒng)計(jì)

          公告

          快樂每一天!

          Everything is an object!

          常用鏈接

          留言簿(2)

          隨筆檔案

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

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 崇明县| 伊通| 温宿县| 斗六市| 两当县| 深州市| 神木县| 丹棱县| 科技| 温州市| 电白县| 武义县| 天等县| 龙州县| 新野县| 宾阳县| 泌阳县| 湖北省| 海安县| 扎鲁特旗| 鸡泽县| 习水县| 集贤县| 格尔木市| 平远县| 舒兰市| 广东省| 廊坊市| 临澧县| 梅河口市| 五大连池市| 台南县| 依安县| 平舆县| 盐津县| 当雄县| 长武县| 南京市| 涟水县| 图们市| 金乡县|