0

我只是想知道是否可以就某些代码获得一些建议

好的,所以我有一个线程类(非常基本)基本上调用了这个对象,我现在将显示它的代码......这个代码给了我一个无限的等待(),我不知道为什么。

  public  void  play()
  {

     if(!queue.isEmpty()){
       synchronized(this)
       {
         if(queue.peek().ballCount <=AvailableGolfBalls)
         {
            //check if there all people in queue, if yes, give them preferance
             queue.poll().notify();
         }
     }
  }




hasBalls=false;

try
{
    while (!hasBalls)
    {
            if(AvailableGolfBalls >= count)
           {

                    AvailableGolfBalls -=count;
                    synchronized(this){
                      //the main code for thread
                     }

                    hasBalls=true;


            }
           else
            {
                //there isnt enough balls,wait
                queue.add(this);

                Thread.sleep(500);
                 System.out.println(ThreadID.get() +" -no balls availiable ");

                synchronized(this)
                {

                    this.wait();
                }

            }
    }


}
catch (InterruptedException exception)
{

}

AvailableGolfBalls +=count;

}

我尽可能地简化了我的代码,虽然它是一个非常简单的程序,但是我一周前才开始使用多线程,很多概念仍然让我感到困惑。这个程序所做的基本上是每个线程在运行之前都需要一定数量的球,如果它没有所需的球,则排队等待它可用。

4

1 回答 1

1

在正确的对象上同步时,您没有调用 notify。

您正在同步this并调用notify存储在队列中的对象。您必须同步存储在队列中的对象才能正确调用notify它们。

Object obj = null;
synchronized(this)
{
     if(queue.peek().ballCount <=AvailableGolfBalls)
     {
         //check if there all people in queue, if yes, give them preferance
         obj = queue.poll();
     }
}
if(obj!=null){
    synchronized(obj){
        obj.notify();
    }
}

这是我认为是错误的。您的代码非常混乱,因为我们不知道类型this是什么。

于 2013-08-11T17:44:45.717 回答