繁体   English   中英

Java等待,通知-等待不起作用?

[英]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()相同的对象或者在onetwo ,取其对象使它暂停。

在您的程序中, Main thread冻结,但是其他两个线程连续执行,直到程序终止。

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

请勿在Thread对象上调用wait()或notify()-这很不幸,但是Thread使用自己的监视器进行其他操作。

我在扩展Thread或实现由于sync(this)挂起的Runnable的类中的困难方式中多次发现了这一点。 自发现此问题以来,我进行了许多次搜索,但从未发现过任何警告不这样做的警告。 而且,如果您有一台快速闲置的计算机,则可能在测试中永远找不到。

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

等待通知线程同步此挂起的线程

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM