2012-04-19 102 views
0

我正在制定相關的等待&簡單的代碼通知我創建了兩個seprate類,下面是類關於等待和通知

class ThreadA { 
public static void main(String [] args) { 
Thread b = new Thread(); 
b.start(); 

synchronized(b) { 
try { 
System.out.println("Waiting for b to complete..."); 
b.wait(); 
} catch (InterruptedException e) {} 
//System.out.println("Total is: " + b.totals); 
} 
} 
} 

and the other one is ... 





class ThreadB extends Thread { 
public int totals; 

public void run() { 
    synchronized(this) { 
    for(int i=0;i<100;i++) { 
     totals += i; 
     } 
     notify(); 
     } 
     } 
    } 

但類的ThreadA內,我收到complie時間錯誤,當我我從b線程對象,它是訪問的總數..

System.out.println("Total is: " + b.totals); 

請告訴我如何糾正它,這樣我可以執行我的代碼.. !!在此先感謝.. 1

+0

雖然答案已經被發現。未來的問題可以通過包含遇到的實際錯誤消息來改進。 – 2012-04-19 17:30:12

+0

而且當你發佈代碼時,請確認標識 – Cratylus 2012-04-19 17:33:15

回答

6

這是迫在眉睫的問題:

Thread b = new Thread(); 

你從來沒有真正創造ThreadB一個實例。該類型的b只有Thread,不ThreadB這就是爲什麼編譯器不能解析totals標識

此外:

  • 公共領域是一個非常糟糕的主意 - 使用屬性,而不是
  • 調用waitnotifyThread上是一個非常糟糕的主意,因爲Thread類自己調用waitnotify
  • 您應該通常執行Runnable而不是擴展Thread,以更好地分離問題。
  • 通常會更好地調用您的班級上的知道要在該代碼可見的只有的顯示器上進行同步,而不是同步(並等待)公開可見的顯示器。它使得更容易推理你的線程。
+0

關於最後一點,聲明的'b'不公開,它在'main'的範圍內,而不是'ThreadA'的公共成員。可能是我對此有所誤解? – Cratylus 2012-04-19 17:42:10

+0

@ user384706:我的意思是同步任何*類外的代碼本身有權訪問(包括'this')是一個壞主意。 'ThreadB'不可能知道對它的實例的廣泛引用可能是什麼。 – 2012-04-19 17:50:00

+0

@JonSkeet「在線程上調用wait和notify是一個非常糟糕的主意,因爲Thread類本身調用wait和notify。」你能解釋一下嗎? – Geek 2012-08-06 13:20:49