2012-04-19 109 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