.notify()不会通知.wait()一个线程

时间:2017-12-06 03:34:13

标签: java multithreading

我一直无法通过通知来获取等待的帖子。

以下是调用notify()的代码:

public static void main(String[] args)
    {
        int endUsers = 0;
        Terminal terminal = new Terminal("Master");
        ArrayList<Thread> threads = new ArrayList<Thread>();
        threads.add(new Thread(
                new EndUser("EndUser 1", DEFAULT_DST_NODE, 50000, 50001),
                "EndUser 1"));
        endUsers++;
        threads.add(new Thread(
                new EndUser("EndUser 2", DEFAULT_DST_NODE, 50001, 50000),
                "EndUser 2"));
        endUsers++;

        for (Thread t : threads)
        {
            t.start();
        }

        while (true)
        {
            int user = terminal.readInt("Which user is sending data?  ");
            if (user <= endUsers && user > 0)
            {
                synchronized (threads.get(user - 1))
                {
                    threads.get(user - 1).notify();
                }
            }
        }
    }
}

以下是调用wait()的代码:

public void run()
{
    while (true)
    {
        try
        {
            synchronized (this)
            {
                this.wait();
            }
            this.send();
        }
        catch (Exception e)
        {

        }
    }
}

我已经尝试了我能想到的一切,但我不知道为什么它不起作用。

1 个答案:

答案 0 :(得分:3)

threads.get(user - 1).notify();

正在调用Thread对象上的notify,其中

this.wait();

正在等待您的runnable或者呼叫所在的班级。 使用

Thread.currentThread().wait();

应该解决您的问题。

此外,我想提一下创建一个Object引用,然后等待并通知这将是一个完全功能的方法来获得你想要的东西

您可以在线程类

中将Object创建为(n)(可选的静态)引用
public final (static) Object waitObject = new Object();
  

编辑:^做最后的事情可以防止其他(可能是恶意的)代码部分   从重新分配值,这将使它成为waitObject.notify()   方法永远无法实现。

然后使用

waitObject.wait();  //or
waitObject.wait(time);

waitObject.notify();  //or
waitObject.notifyAll();

编辑: 正如@shmosel所指出的那样,使用&#34;等待&#34;,&#34;睡眠&#34;或&#34;通知&#34;本质上是不安全的。来自一个线程,如Java文档中所述。然而,尽管如此,尽管不鼓励,仍然可以使用该功能。

对于其他Java引用,您可以使用多个资源;如。: Java API OverviewJava Thread APIThis Google Search - Safe Java Practices(您可以将您正在查看的内容添加到其中,例如&#34;线程,等待&#34;用于&#34的搜索查询;安全Java实践线程,等待&#34;)等等。