Java 关于等待和通知
我正在开发与wait¬ify相关的简单代码,我创建了两个seprate类,下面是这些类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
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作为解释。