java中的多线程,难以等待

时间:2014-11-15 10:09:31

标签: java multithreading

这是我的代码的一部分,我在使用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类和所有使用的构造函数和变量。我省略了它们,因为代码太长了

2 个答案:

答案 0 :(得分:2)

notify上的另一个对象wait

您的Leader类在this上同步(隐式,因为您在实例方法上放置了synchronized)。因此,Leader等待Leader实例通知。

Soldier课程中,您还要在this上进行同步,并在Soldier个实例上进行通知。

但是,由于您在Soldier实例上通知并且Leader实例上的Leader等待,因此不会收到通知。

实例SoldierLeader都应使用相同的同步对象。

您可能希望在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()函数。