我在Thread
中与Java
学习工作。
我正在尝试编写一个有两个线程的程序。
每个线程都会在循环中写下您的名字。
在Main
运行周期中将生成数字(0,9)。
当它生成一个奇数时,等待线程1(偶数 - 线程2)。
如果一个线程会睡觉并唤醒他。
问题是,当我打电话给等待时,程序会冻结。
代码:
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);
}
}
}
答案 0 :(得分:1)
程序中有三个线程,Main thread
是程序开始执行的地方,方法是输入main()
方法。 Main thread
创建两个主题,即第一个主题和第二个主题。第一个和第二个线程运行run()
方法。 Main thread
正在运行main()
方法。当您在one.wait()
方法中调用main()
时,它会暂停当前线程,即Main thread
。 它不会暂停Thread one
。 two.wait()
也是如此,它也会暂停Main thread
。现在Main thread
只能恢复,如果任何其他线程在notify()
或notifyAll()
的同一对象上调用one
或two
,则无论哪个对象都要暂停。
在你的程序中,Main thread
冻结,但另外两个线程会一直执行,直到程序终止。
答案 1 :(得分:0)
我想创建一个答案,重新播放@ jonskeet上面的评论:
不要在Thread对象上调用wait()或notify() - 这很不幸,但Thread使用自己的监视器来处理其他事情。
我已经多次在扩展线程或实现由于synchronized(this)而挂起的 Runnable 的类中发现了这种情况。自从发现这个问题以来,我已经多次搜索过,在任何地方都没有发现任何警告要求不这样做。如果你有一台快速,闲置的计算机,你可能永远不会在测试中找到它。
也许google-foo更好的人可以找到文档。如果是,请评论或修改此答案。
等待通知线程同步这个挂起的线程