<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-95  評論-31  文章-10  trackbacks-0


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

    這個問題先放下,先看線程狀態圖:

    new出一個線程后,處于Runnable狀態,獲得CPU控制權后執行,接著處于Running狀態,如果沒有控制,正常執行完畢會自動消亡即Dead。
    處于Running狀態的線程,第一:調用sleep或者join方法或者阻塞IO會進入阻塞狀態,一旦釋放會自動進入Runnable狀態。第二:調用wait方法會使線程處于等待池(是個對象池),一旦調用notify()或者interupt()方法線程會進入鎖池(是個對象池),然后就會進入Runnable狀態,等待CPU控制權。第三:運行中的線程進入synchronized方法或者synchronized代碼段,會進入鎖池,并且只有在synchronized里面才能調用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():"當前線程增加一個數據后:"+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():"當前線程減少一個數據后:"+(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)
            {}

    }


    }


    }


    當調用push方法的時候,當前線程鎖定this對象,當棧滿了,開始調用wait()方法,使生產者線程處于等待池。當消費者線程通知生產者線程繼續生產的時候,wait()方法終結,如果使用if條件,并且處于多線程狀態(有若干個生產者線程),那么這個時候有可能另外一個處于鎖池狀態的線程開始執行,那么該線程會生產導致棧滿,而這個時候剛執行完wait()方法的線程也開始生產,那么會導致溢出。所以采用while循環,繼續判斷棧是否滿,如果不滿,那么執行生產,這個時候絕對不會出現任何問題,因為synchronized該線程獲得鎖,其余線程無法進入,必定安全。

    釋放對象的鎖:
    1、執行完同步代碼塊,就會釋放鎖
    2、執行同步代碼塊的過程中,執行了鎖所屬對象的wait()方法,這個線程會釋放鎖,進入對象的等待池。
    3、執行同步代碼塊的過程中,遇到異常而導致線程終止,鎖也會釋放

    不會釋放鎖:
    1、執行了Thread.sleep()方法,當前線程放棄CPU,開始睡眠,但不會釋放鎖。
    2、執行同步代碼塊的過程中,執行了Thread.yield()方法,當前線程放棄CPU但不會釋放鎖。

    posted on 2011-11-09 22:04 朔望魔刃 閱讀(219) 評論(0)  編輯  收藏 所屬分類: java
    主站蜘蛛池模板: 最新亚洲人成无码网站| 亚洲国产精品xo在线观看| 国产精品亚洲精品日韩电影| 野花高清在线电影观看免费视频 | 免费一级毛片正在播放| 亚洲成a人无码亚洲成www牛牛| 动漫黄网站免费永久在线观看| 亚洲av产在线精品亚洲第一站| 妻子5免费完整高清电视| 亚洲乱码在线播放| 日产乱码一卡二卡三免费| 羞羞漫画在线成人漫画阅读免费 | 亚洲经典在线中文字幕| 日本人的色道免费网站| 亚洲偷偷自拍高清| 国产美女精品久久久久久久免费| 福利片免费一区二区三区| 亚洲人成人无码网www电影首页| 久久精品私人影院免费看| jlzzjlzz亚洲jzjzjz| 日韩免费一级毛片| 亚洲免费日韩无码系列| 亚洲精品免费视频| 成年在线观看免费人视频草莓| 免费手机在线看片| 亚洲av永久无码精品国产精品| 成人免费黄色网址| 一个人看的在线免费视频| 亚洲an天堂an在线观看| 成人免费男女视频网站慢动作 | 精品成人免费自拍视频| 久久久久se色偷偷亚洲精品av | 亚洲最大中文字幕无码网站| 免费观看国产精品| 免费无遮挡无码永久视频| 亚洲欧洲国产综合AV无码久久| 亚洲真人日本在线| 免费看污成人午夜网站| 无码免费又爽又高潮喷水的视频| 亚洲AV无码成人精品区在线观看| 日韩精品视频免费在线观看|