在下面的伪代码中,我有一个poll()
函数,可以在主线程中永久调用。当我在sleep()
中没有poll()
语句的情况下执行此操作时,另一个线程只会将每分钟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;
}
}
答案 0 :(得分:12)
这是否意味着轮询会阻止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个条目的约束阻塞队列,我猜主要在sleep()
上阻塞,然后队列填满并减慢您的程序。如果sleep
返回poll()
并且睡眠时间较短,您可能只应该null
。
编辑:正如@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;