0
public class B extends Thread { 

    @Override 
    public void run() { 
     print(); 
    } 

    public synchronized void print(){ 
    int i; 
     for (i=0;i<1000;i++){ 
     System.out.println(Thread.currentThread().getName()); 
     } 
    } 

} 

public class A { 
    public static void main(String[] args) { 
     B b1=new B(); 
     B b2=new B(); 

     b1.start(); 
     b2.start(); 
    } 
} 

如何鎖定打印方法訪問類B的兩個對象?我想要的是在這裏我同步的方法沒有使用它!所以我想讓線程1先運行print方法然後再運行線程2。我如何更改代碼?如何阻塞兩個線程對象訪問方法1,來自同一類

回答

0

嘗試類對象

public void print(){ 
    synchronized(B.class) { 
     int i; 
     for (i=0;i<1000;i++) { 
      System.out.println(Thread.currentThread().getName()); 
     } 
    } 
} 
+0

B.class是什麼意思?這是否意味着我們必須將其鎖定在課堂級別? @ andrey-cheboksarov – eagle

+0

@eagle是的,就是這樣。你鎖定類對象。用同步化的非靜態方法鎖定實例。在你的情況下,實例可能意味着b1或b2,但它們是獨立的。另一種選擇是有同步靜態方法,它會起作用 –

+0

謝謝!我得到了很好的解釋! @安德烈 - cheboksarov – eagle

1

可以使用thread.join()如圖中下面的代碼與內部註釋上同步:

B類代碼:

public class B extends Thread { 

     @Override 
     public void run() { 
      print(); 
     } 

     //Remove synchronized 
     public void print(){ 
      int i; 
      for (i=0;i<1000;i++){ 
       System.out.println(Thread.currentThread().getName()); 
      } 
     } 
    } 

類A代碼:

public class A { 

    public static void main(String[] args) throws Exception { 
      B b1=new B(); 
      B b2=new B(); 

      b1.start();//start first thread 

      b1.join();//Use join, to let first thread complete its run() 

      b2.start();//run second thread 
     } 
} 

此外,作爲便箋,我建議您使用class B implements Runnable比延伸Thread