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

在简单java程序中使用带线程的队列,java,multithreading,queue,Java,Multithreading,Queue,我只是想知道我是否能得到一些关于代码的建议 好的,我有一个线程类(非常基本)基本上调用了这个对象,我刚才将展示它的代码。。。这段代码给了我无限的等待(),我不知道为什么 public void play() { if(!queue.isEmpty()){ synchronized(this) { if(queue.peek().ballCount <=AvailableGolfBalls) {

我只是想知道我是否能得到一些关于代码的建议

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

  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;
public void play()
{
如果(!queue.isEmpty()){
已同步(此)
{
if(queue.peek().ballCount=count)
{
AvailableGolfBalls-=计数;
已同步(此){
//线程的主代码
}
Hasball=正确;
}
其他的
{
//球不够,等等
queue.add(这个);
睡眠(500);
System.out.println(ThreadID.get()+“-无球可用”);
已同步(此)
{
这个。等等();
}
}
}
}
捕获(中断异常异常)
{
}
AvailableGolfBalls+=计数;
}

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

在正确的对象上同步时,您没有调用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();
    }
}
objectobj=null;
已同步(此)
{

if(queue.peek().ballCount我觉得这段代码很搞笑。
if(!hasBalls)
if(woman)
if(woman)if(hasBalls)需要球来编码多线程男人,lol
if(hasBalls)canMultiThread();else cantMultiThread();
im使用私有队列=新的ConcurrentLinkedQueue();//*对于队列如果您想要一个包含线程的队列,我建议使用ExecutorService,因为它可以同时执行这两个任务,并提供可管理性和基于任务的控制和结果。我认为您应该将obj置于同步状态,否则会出现监控异常。因为这与指向该对象的obj指向的对象不同您从队列中轮询。该对象是每个线程调用的对象,它是保存该方法的类。但我的逻辑是否正确?大致上?根据发布的代码,我无法评论您的逻辑是否正确,因为没有足够的信息。发布更多与同步和线程相关的代码,我可以提供更多帮助.