在简单的java程序中使用带有线程的队列

时间:2013-08-11 17:14:29

标签: java multithreading queue

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

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

  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;

}

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

1 个答案:

答案 0 :(得分: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是什么类型。