[英]Java wait, notify - wait not working?
我正在学习Java
Thread
。 我正在尝试编写一个具有两个线程的程序。 每个线程都会在循环中写下您的名字。 在Main
run cycle中将生成数字(0,9)。 当它生成奇数时,请等待线程1(偶数线程2)。 如果一个线程会睡觉并唤醒他。 问题是当我调用wait时,程序冻结。 码:
import java.util.Random;
public class TestClass {
public static void main(String[] args) throws InterruptedException {
myThread one = new myThread("Thread one");
myThread two = new myThread("Thread two");
one.start();
two.start();
Random random = new Random();
for (int i = 0; i < 10; i++) {
int rnd = random.nextInt(10);
if (rnd % 2 == 0) {
synchronized (two) {
two.wait(); // first loop - freez
}
} else {
synchronized (one) {
one.wait();
}
}
}
}
}
class myThread extends Thread {
private boolean canIRun = true;
private final String name;
myThread(String name) {
this.name = name;
}
@Override
public void run() {
while (canIRun) {
System.out.println("My name is: " + name);
}
}
}
您的程序中有三个线程, Main thread
是通过输入main()
方法开始执行程序的位置。 Main thread
创建两个线程,即线程一和线程二 。 线程一和线程二运行它们的run()
方法。 Main thread
正在运行main()
方法。 当您在main()
方法中调用one.wait()
时,它将暂停当前线程,即Main thread
。 它不会暂停Thread one
。 two.wait()
也是如此,它也会暂停Main thread
。 现在, Main thread
只能重新开始,如果任何其他线程调用notify()
或notifyAll()
相同的对象或者在one
或two
,取其对象使它暂停。
在您的程序中, Main thread
冻结,但是其他两个线程连续执行,直到程序终止。
我想创建一个答案,重新广播上面的@jonskeet的评论:
请勿在Thread对象上调用wait()或notify()-这很不幸,但是Thread使用自己的监视器进行其他操作。
我在扩展Thread或实现由于sync(this)挂起的Runnable的类中的困难方式中多次发现了这一点。 自发现此问题以来,我进行了许多次搜索,但从未发现过任何警告不这样做的警告。 而且,如果您有一台快速闲置的计算机,则可能在测试中永远找不到。
也许拥有更好google-foo的人可以找到该文档。 如果是这样,请评论或修改此答案。
等待通知线程同步此挂起的线程
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.