隨筆-95  評(píng)論-31  文章-10  trackbacks-0


          -Object類中有五個(gè)關(guān)于線程的方法:三個(gè)重載的wait()方法和notify()、notifyAll()
          問(wèn)題1:為什么這些方法不定義在Thread類里面作為靜態(tài)方法使用?而是在Object類里面?

          這個(gè)問(wèn)題先放下,先看線程狀態(tài)圖:

          new出一個(gè)線程后,處于Runnable狀態(tài),獲得CPU控制權(quán)后執(zhí)行,接著處于Running狀態(tài),如果沒(méi)有控制,正常執(zhí)行完畢會(huì)自動(dòng)消亡即Dead。
          處于Running狀態(tài)的線程,第一:調(diào)用sleep或者join方法或者阻塞IO會(huì)進(jìn)入阻塞狀態(tài),一旦釋放會(huì)自動(dòng)進(jìn)入Runnable狀態(tài)。第二:調(diào)用wait方法會(huì)使線程處于等待池(是個(gè)對(duì)象池),一旦調(diào)用notify()或者interupt()方法線程會(huì)進(jìn)入鎖池(是個(gè)對(duì)象池),然后就會(huì)進(jìn)入Runnable狀態(tài),等待CPU控制權(quán)。第三:運(yùn)行中的線程進(jìn)入synchronized方法或者synchronized代碼段,會(huì)進(jìn)入鎖池,并且只有在synchronized里面才能調(diào)用wait()方法。

           1public Class MyStack
           2{
           3 private int[] a;
           4 private int MAX_SIZE;
           5 private int count;
           6
           7 public MyStack(){}
           8 public MyStack(int size)
           9{
          10   MAX_SIZE=size;
          11   a = new int[MAX_SIZE];
          12}
           
          13
          14  public synchronized void push()
          15{
          16    while(count==MAX_SIZE)
          17{
          18    try{
          19    this.wait();
          20    }
          catch(InterruptedException e)
          21{
          22}
             
          23}

          24    a[count++]=count;
          25    System.out.println(Thread.currentThread().getName():"當(dāng)前線程增加一個(gè)數(shù)據(jù)后:"+count);
          26     this.notifyAll();
          27}

          28public synchronized int pop()
          29{
          30   while(count==0)
          31{   
          32try{
          33    this.wait();
          34   }
          catch(InterruptedException e)
          35{}
          36}
            
          37   this.notifyAll();
          38   System.out.println(Thread.currentThread().getName():"當(dāng)前線程減少一個(gè)數(shù)據(jù)后:"+(count-1));
          39   return a[--count];
          40}

          41}

           

           1public Class Producer extends Thread
           2{
           3  private MyStack stack;
           4  public Producer(MyStack stack)
           5{
           6  this.stack= stack;
           7}

           8  @Override
           9  public void run()
          10{
          11  while(true)
          12{
          13   stack.push();
                   try{
                    Thread.sleep(200)
                   }catch(Exception e)
                  {}
          14}

          15}

          16}

           

          public Class Consumer extends Thread
          {
            
          private MyStack stack;
            
          public Consumer(MyStack stack)
          {
             
          this.stack=stack;
          }

            @Override
            
          public void run()
          {
            
          while(true)
          {
             stack.pop();
                   try{
                    Thread.sleep(200)
          }catch(Exception e)
                  {}

          }


          }


          }


          當(dāng)調(diào)用push方法的時(shí)候,當(dāng)前線程鎖定this對(duì)象,當(dāng)棧滿了,開(kāi)始調(diào)用wait()方法,使生產(chǎn)者線程處于等待池。當(dāng)消費(fèi)者線程通知生產(chǎn)者線程繼續(xù)生產(chǎn)的時(shí)候,wait()方法終結(jié),如果使用if條件,并且處于多線程狀態(tài)(有若干個(gè)生產(chǎn)者線程),那么這個(gè)時(shí)候有可能另外一個(gè)處于鎖池狀態(tài)的線程開(kāi)始執(zhí)行,那么該線程會(huì)生產(chǎn)導(dǎo)致棧滿,而這個(gè)時(shí)候剛執(zhí)行完wait()方法的線程也開(kāi)始生產(chǎn),那么會(huì)導(dǎo)致溢出。所以采用while循環(huán),繼續(xù)判斷棧是否滿,如果不滿,那么執(zhí)行生產(chǎn),這個(gè)時(shí)候絕對(duì)不會(huì)出現(xiàn)任何問(wèn)題,因?yàn)閟ynchronized該線程獲得鎖,其余線程無(wú)法進(jìn)入,必定安全。

          釋放對(duì)象的鎖:
          1、執(zhí)行完同步代碼塊,就會(huì)釋放鎖
          2、執(zhí)行同步代碼塊的過(guò)程中,執(zhí)行了鎖所屬對(duì)象的wait()方法,這個(gè)線程會(huì)釋放鎖,進(jìn)入對(duì)象的等待池。
          3、執(zhí)行同步代碼塊的過(guò)程中,遇到異常而導(dǎo)致線程終止,鎖也會(huì)釋放

          不會(huì)釋放鎖:
          1、執(zhí)行了Thread.sleep()方法,當(dāng)前線程放棄CPU,開(kāi)始睡眠,但不會(huì)釋放鎖。
          2、執(zhí)行同步代碼塊的過(guò)程中,執(zhí)行了Thread.yield()方法,當(dāng)前線程放棄CPU但不會(huì)釋放鎖。

          posted on 2011-11-09 22:04 朔望魔刃 閱讀(220) 評(píng)論(0)  編輯  收藏 所屬分類: java
          主站蜘蛛池模板: 吴旗县| 泉州市| 海口市| 易门县| 盈江县| 宝鸡市| 澎湖县| 滦平县| 旌德县| 北海市| 临桂县| 晋州市| 祥云县| 都昌县| 沁水县| 丹寨县| 桂东县| 门头沟区| 绿春县| 梨树县| 合山市| 环江| 盱眙县| 永平县| 托里县| 肇东市| 揭阳市| 宜良县| 南丹县| 阿鲁科尔沁旗| 沧州市| 额济纳旗| 咸丰县| 沙坪坝区| 临漳县| 固安县| 儋州市| 河源市| 镇赉县| 靖远县| 定结县|