Java 在调用remove()之前检查队列是否还有剩余内容
在一组线程处理元素之前,我使用一个队列对元素进行排队:Java 在调用remove()之前检查队列是否还有剩余内容,java,multithreading,thread-safety,queue,Java,Multithreading,Thread Safety,Queue,在一组线程处理元素之前,我使用一个队列对元素进行排队: public class AsyncActionQueue implements Serializable { ... private Queue<QueuedAction> queue; public AsyncActionQueue() { this.queue = new ConcurrentLinkedQueue<>(); } ...
public class AsyncActionQueue implements Serializable {
...
private Queue<QueuedAction> queue;
public AsyncActionQueue() {
this.queue = new ConcurrentLinkedQueue<>();
}
...
private class QueueProcessor implements Runnable {
private boolean isKilled = false;
public void run() {
while(!isKilled) {
QueuedAction action = queue.remove();
公共类AsyncActionQueue实现可序列化{
...
专用队列;
公共异步操作队列(){
this.queue=新的ConcurrentLinkedQueue();
}
...
私有类QueueProcessor实现可运行{
私有布尔值iskill=false;
公开募捐{
而(!iskill){
QueuedAction=queue.remove();
我认为如果队列中没有更多的元素,则queue.remove()
将返回null,但是我得到了一个
在这种情况下,队列是一个单例队列,可以使用弹性数量的线程清空它。对于线程来说,在尝试删除之前检查队列中是否有元素的最佳方法是什么?我应该只检查
queue.size()>0,意思是线程安全吗?您可以捕获异常或使用poll()
,如果为空,它将返回null
捕获一个RuntimeException
本身并不一定是一个“坏习惯”,但在这种情况下,它将是不必要的,因为它包含两种需求的方法。对于删除remove()
抛出一个异常,poll()
返回null,对于插入,您有add()
和offer()
等
在调用remove()
之前测试大小也不会有帮助,因为它不是atomi。大小可能会返回为1
,然后另一个线程可能会将其删除,而此线程的remove()
无论如何都会抛出异常。您可以捕获异常,也可以使用poll()
,如果为空,它将返回null
捕获一个RuntimeException
本身并不一定是一个“坏习惯”,但在这种情况下,它将是不必要的,因为它包含两种需求的方法。对于删除remove()
抛出一个异常,poll()
返回null,对于插入,您有add()
和offer()
等
在调用remove()
之前测试大小也不会有帮助,因为它不是atomi。大小可能会返回为1
,然后另一个线程可能会将其删除,而此线程的remove()
无论如何都会抛出异常。或者您可以捕获异常?这是一个运行时异常,因此捕获它是一个坏习惯。有点像空指针……您可以检查队列。isEmpty()
要检查队列是否为空,还可以使用线程安全的ConcurrentLinkedQueue
。为什么要进行向下投票?或者您可以捕获异常?这是一个运行时异常,因此捕获它是一个坏习惯。有点像空指针…您可以检查queue.isEmpty()
要检查队列是否为空,您也在使用线程安全的ConcurrentLinkedQueue
。为什么要进行向下投票?很好,这正是我想要的。本质上,poll()
类似于remove()
但如果为空,则返回null我认为捕获RuntimeException
是一个坏习惯。异常非常昂贵,应该在“异常”情况下使用。您的pol()
答案非常正确。完美,这就是我想要的。本质上,poll()
类似于remove()
但如果为空,则返回null。我认为捕获运行时异常是一个坏习惯。异常代价高昂,应在“异常”情况下使用。您的pol()
答案非常正确。