Java等待,通知 - 等待不工作?

时间:2015-05-15 15:19:09

标签: java multithreading

我在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);
        }
    }

}

2 个答案:

答案 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()的同一对象上调用onetwo,则无论哪个对象都要暂停。

在你的程序中,Main thread冻结,但另外两个线程会一直执行,直到程序终止。

答案 1 :(得分:0)

我想创建一个答案,重新播放@ jonskeet上面的评论:

不要在Thread对象上调用wait()或notify() - 这很不幸,但Thread使用自己的监视器来处理其他事情。

我已经多次在扩展线程或实现由于synchronized(this)而挂起的 Runnable 的类中发现了这种情况。自从发现这个问题以来,我已经多次搜索过,在任何地方都没有发现任何警告要求不这样做。如果你有一台快速,闲置的计算机,你可能永远不会在测试中找到它。

也许google-foo更好的人可以找到文档。如果是,请评论或修改此答案。

等待通知线程同步这个挂起的线程