Java 关于等待和通知

Java 关于等待和通知,java,Java,我正在开发与wait¬ify相关的简单代码,我创建了两个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 (In

我正在开发与wait¬ify相关的简单代码,我创建了两个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();
      }
      }
     }

请告诉我如何更正它,以便我可以执行我的代码。。!!提前谢谢。。!1

这是当前的问题:

Thread b = new Thread();
您从未实际创建
ThreadB
的实例。
b
的类型只是
Thread
,而不是
ThreadB
,这就是编译器无法解析
总计
标识符的原因

此外:

  • 公共字段是一个非常糟糕的主意-使用属性代替
  • 线程
    上调用
    等待
    通知
    是一个非常糟糕的主意,因为
    线程
    类本身调用
    等待
    通知
  • 通常应该实现
    Runnable
    ,而不是扩展
    Thread
    ,以便更好地分离关注点
  • 一般来说,在类上调用知道在只对该代码可见的监视器上同步的东西比同步(并等待)一个公共可见的监视器要好。这样可以更容易地对线程进行推理

这是最紧迫的问题:

Thread b = new Thread();
您从未实际创建
ThreadB
的实例。
b
的类型只是
Thread
,而不是
ThreadB
,这就是编译器无法解析
总计
标识符的原因

此外:

  • 公共字段是一个非常糟糕的主意-使用属性代替
  • 线程
    上调用
    等待
    通知
    是一个非常糟糕的主意,因为
    线程
    类本身调用
    等待
    通知
  • 通常应该实现
    Runnable
    ,而不是扩展
    Thread
    ,以便更好地分离关注点
  • 一般来说,在类上调用知道在只对该代码可见的监视器上同步的东西比同步(并等待)一个公共可见的监视器要好。这样可以更容易地对线程进行推理

尽管答案已经找到。将来的问题可以通过包含遇到的实际错误消息来改进。此外,当您发布代码时,尽管已经找到了答案,但请确保标识正确。将来的问题可以通过包含遇到的实际错误消息来改进。此外,在发布代码时,请确保与最后一点相关的标识,声明的
b
不公开可见。它在
main
的范围内,并且不是
ThreadA
的公开成员。我可能误解了您关于这一点的说明吗?@user384706:我的意思是,在类之外的代码本身可以访问的任何内容(包括
this
)上进行同步是一个坏主意
ThreadB
不可能知道引用它的实例的范围有多广。@JonSkeet“在线程上调用wait和notify是一个非常糟糕的主意,因为Thread类本身调用wait和notify。”你能解释一下吗?@Geek:基本上就是我说的-Java的其他部分也会在
线程
对象上调用
等待
通知
,这会干扰你对它的任何调用。在可能的情况下,锁定、等待并通知一个只有代码知道的对象。+Jon+1作为解释。关于最后一点,声明的
b
不公开可见。它在
main
的范围内,并且不是
ThreadA
的公开成员。我可能误解了您关于这一点的说明吗?@user384706:我的意思是,在类之外的代码本身可以访问的任何内容(包括
this
)上进行同步是一个坏主意
ThreadB
不可能知道引用它的实例的范围有多广。@JonSkeet“在线程上调用wait和notify是一个非常糟糕的主意,因为Thread类本身调用wait和notify。”你能解释一下吗?@Geek:基本上就是我说的-Java的其他部分也会在
线程
对象上调用
等待
通知
,这会干扰你对它的任何调用。只要可能,锁定、等待并通知一个只有代码知道的对象。+Jon+1作为解释。