多線程--基礎篇3--內部類

上一篇說的多線程操作都是同一種操作,即j--,若有另一種操作要做j++操作呢?因每種操作都個操作都要覆寫run()方法,所以兩種操作要放在不同的類中,那共享變量j放在哪裏呢?此時通過內部類即可很方便實現。

public class TestThread {
     private int j = 100;

     public class Dec implements Runnable {
          public void run() {
               for (int i = 0; i < 100; i++) {
                    System.out.println(Thread.currentThread().getName());
                    sale();
                }
          }  
     }
     public synchronized void sale() {//不知sale方法寫在Dec類裏面,
            if (j > 0) {
                  System.out.println("賣第" + j + "張票!");
                   j--;
            }
      }
     public class Inc implements Runnable {
            public void run() {
                  for (int i = 0; i < 100; i++) {
                            System.out.println(Thread.currentThread().getName());
                             buy();
                  }
             }
      }
     public synchronized void buy() {
            if (j < 100) {
                   j++;
                   System.out.println("買第" + j + "張票!氣死你");
            }
      }
      public void begin(){
           Dec d=new Dec();
           Inc i=new Inc();

           new Thread(d,"axue2").start();
           new Thread(i,"shixin1").start();
           new Thread(d,"axue1").start();
           new Thread(i,"shixin2").start();
  
        }
}


當一個線程進入一個對象的一個synchronized方法後,其他線程只能訪問該對象的其他非同步方法,同步方法不能進入。

這裏需要強調的事“該對象”,上面例子中如果把sale()方法放到Dec類中,把buy()方法放到Inc類中,則synchronized則會不起作用,會同時操作共享變量j。

發佈了32 篇原創文章 · 獲贊 16 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章