这是我的代码的一部分,我在使用wait()
class Leader extends Thread {
private Table table;
synchronized public void run()
{
while(true)
{
try
{
while(table.getResources()!=0)
wait();
table.putResources(5); // here I am updating the value(I have a table class)
} catch(InterruptedException e) { }
}
}
}
class Soldier extends Thread {
public void run()
{
while(true)
{
try
{
synchronized(this)
{
if(table.getResources()==this.need_Value) //checking value of resource
{
sleep(1000);
table.clearResources(); //this will put the value of resource to 0
notifyAll();
}
}
} catch(InterruptedException e) { }
}
}
}
所以基本上我有一个领导者类的线程和一个Leader类的线程。最初资源为0
,因此在Soldier类资源中更新为5
。现在假设Soldier
类need_Value为5
,因此它会将资源值更新为0
。所以现在Leader
类应该再次运行,因为资源是0
,但实际上它还在等待。那么我的wait()
PS-假设我有Table类和所有使用的构造函数和变量。我省略了它们,因为代码太长了
答案 0 :(得分:2)
您notify
上的另一个对象wait
。
您的Leader
类在this
上同步(隐式,因为您在实例方法上放置了synchronized)。因此,Leader
等待Leader
实例通知。
在Soldier
课程中,您还要在this
上进行同步,并在Soldier
个实例上进行通知。
但是,由于您在Soldier
实例上通知并且Leader
实例上的Leader
等待,因此不会收到通知。
实例Soldier
和Leader
都应使用相同的同步对象。
您可能希望在Leader
Soldier
实例作为同步对象来解决此问题
class Soldier extends Thread {
private Leader leader;
public Soldier(Leader leader) {
this.leader = leader;
}
public void run()
{
while(true)
{
try
{
synchronized(leader)
{
if(table.getResources()==this.need_Value) //checking value of resource
{
sleep(1000);
table.clearResources(); //this will put the value of resource to 0
leader. notifyAll();
}
}
} catch(InterruptedException e) { }
}
}
}
答案 1 :(得分:0)
阅读这个问题的答案:How to use wait and notify in Java?它详细解释了如何正确使用Wait()和Notify()函数。