Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在调用remove()之前检查队列是否还有剩余内容_Java_Multithreading_Thread Safety_Queue - Fatal编程技术网

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()
答案非常正确。