Java 轮询是否阻止LinkedBlockingQueue中的其他操作?

Java 轮询是否阻止LinkedBlockingQueue中的其他操作?,java,multithreading,blockingqueue,Java,Multithreading,Blockingqueue,在下面的伪代码中,我有一个poll()函数,它在主线程中永远被调用。当我在没有poll()中的sleep()语句的情况下执行此操作时,另一个线程每分钟只向队列添加2-3个项目。这是否意味着轮询会阻止put()语句 我怎样才能解决这个问题 public class Test extends Thread{ private LinkedBlockingQueue<Object> queue = null; Test(){ queue = new Link

在下面的伪代码中,我有一个
poll()
函数,它在主线程中永远被调用。当我在没有
poll()
中的
sleep()
语句的情况下执行此操作时,另一个线程每分钟只向队列添加2-3个项目。这是否意味着轮询会阻止
put()
语句

我怎样才能解决这个问题

public class Test extends Thread{
    private LinkedBlockingQueue<Object> queue = null;

    Test(){
        queue = new LinkedBlockingQueue<Object>(10);
    }

    public void run(){
        // Do stuff, get incoming object from network
        queue.put(o);
    }

    public Object poll(){
        Object o = queue.poll();
        sleep(1000);
        return o;
    }
}
公共类测试扩展线程{
私有LinkedBlockingQueue队列=null;
测试(){
队列=新的LinkedBlockingQueue(10);
}
公开募捐{
//做一些事情,从网络中获取传入对象
队列。put(o);
}
公共对象轮询(){
对象o=queue.poll();
睡眠(1000);
返回o;
}
}
这是否意味着轮询会阻止put()语句

否,
LinkedBlockingQueue
是完全可重入的,
poll()
方法不会阻止
put()
。但是,
poll()
方法会立即返回。您可能应该使用
queue.take()
,它等待队列中有一个项目,而不是在队列为空时返回null

// wait for there to be an object in the queue
Object o = queue.take();
// no sleep necessary
return o;
由于您正在构造一个包含10个条目的受约束阻塞队列,我猜main正在阻塞
sleep()
,然后该队列将填满并减慢您的程序。如果
poll()
返回
null
并睡眠较短的时间,您可能只需要
sleep

Edit:正如注释中提到的@JohnVint,另一种选择是使用
poll(long,TimeUnit)
方法,该方法将在一段时间内等待将项目添加到队列中,如果计时器过期,则返回
null
。这是一种更干净的排队等待方式

// wait for 1000ms for there to be an object in the queue
Object o = queue.poll(1000, TimeUnit.MILLISECONDS);
// no sleep necessary
return o;

是的,那是我的第一个想法。但是如果我使用take(),如果队列为空,我的主线程将被阻塞。我还想在这个线程中做一些其他的事情。@fibera看看公共E poll(长超时,TimeUnit)抛出InterruptedException(中断异常)的功能。比睡眠更干净、更正确。约翰关于投票(timout,unit)的看法是正确的。你也只能在
(o==null)
的情况下睡觉,并将睡眠时间显著减少到10或20毫秒。@John Ok tyvm伙计们。我将查看轮询(超时,单位)。