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