问题描述
所以我一直在用 Java 编写一个简单的等待/通知示例,但由于某种原因,我无法让它正常运行.如果有人能够看到可能是什么问题,将不胜感激!
So I have been working on a simple wait/notify example in Java and for some reason I have not been able to get it to run properly. If anyone is able to see what might be the issue It would be very appreciated!
public class ThreadDemonstration
{
private String str = null;
Thread stringCreator = new Thread(new Runnable()
{
public void run()
{
synchronized(this)
{
str = "I have text";
notify();
}
}
});
private Thread stringUser = new Thread(new Runnable()
{
public void run()
{
synchronized(this)
{
if(str == null)
{
try {
System.out.println("str is null, I need help from stringCreator");
wait();
System.out.println(str);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
});
public static void main (String [] args)
{
ThreadDemonstration td = new ThreadDemonstration();
td.stringUser.start();
td.stringCreator.start();
}
}
我目前的输出是:str 为空,我需要 stringCreator 的帮助
因此出于某种原因,线程 stringCreator 没有唤醒 stringUser 还是我完全错过了其他东西?
So for some reason the thread stringCreator does not wake up the stringUser or am I missing something else entirely?
谢谢!
推荐答案
您的块在不同的对象上同步
.它们应该在一个公共对象上同步
,例如下面的 monitor
对象:
Your blocks are synchronized
over different objects. They should be synchronized
over a common object, for example the monitor
object below:
public class ThreadDemonstration
{
private String str = null;
private final Object monitor = new Object();
Thread stringCreator = new Thread(new Runnable()
{
public void run()
{
synchronized(monitor)
{
str = "I have text";
monitor.notify();
}
}
});
private Thread stringUser = new Thread(new Runnable()
{
public void run()
{
synchronized(monitor)
{
while(str == null) //changed from if to while. This allows you to wait again if the thread gets woken up by something other than the appropriate notify.
{
try {
System.out.println("str is null, I need help from stringCreator");
monitor.wait();
//removed print statement from here
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
System.out.println(str); //added print statement here. str is guaranteed to not be null here.
}
}
});
为了避免创建单独的同步对象,您可以使用synchronized(ThreadDemonstration.this)
或synchronized(ThreadDemonstration.class)
为例.
In order to avoid creating a separate object for synchronization, you can use synchronized(ThreadDemonstration.this)
or synchronized(ThreadDemonstration.class)
for example.
这篇关于Java 等待/通知不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!