我一直无法通过通知来获取等待的帖子。
以下是调用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)
{
}
}
}
我已经尝试了我能想到的一切,但我不知道为什么它不起作用。
答案 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 Overview,Java Thread API,This Google Search - Safe Java Practices(您可以将您正在查看的内容添加到其中,例如&#34;线程,等待&#34;用于&#34的搜索查询;安全Java实践线程,等待&#34;)等等。