【问题标题】:Peeking deep into Queue深入查看队列
【发布时间】:2013-07-25 03:10:02
【问题描述】:

我正在使用BlockingQueue,并且希望能够查看队列中的下一个元素。 Queue.peek() 给了我第一个下一个元素,但我需要更深入。

是否有标准方法,或者我应该自己实现(包括处理线程安全问题)?

【问题讨论】:

    标签: java queue peek


    【解决方案1】:

    queue.stream().peek(e -> System.out.println(e));

    在遍历的同时,你可以对每个元素做一些事情,然后构建你自己的元素。

        System.out.println(Stream.of("one", "two", "three", "four")
              .filter(e -> e.length() > 3)
              .peek(e -> System.out.println("After Filter: " + e))
              .map(String::toUpperCase)
              .peek(e -> System.out.println("After Mapped value: " + e))
              .collect(Collectors.toList()));
    
    
    After Filter: three
    After Mapping: THREE
    After Filter: four
    After Mapping: FOUR
    [THREE, FOUR]
    

        Queue<Boolean> qq = new ArrayBlockingQueue<>(10);
        for(Boolean element : qq) {
            System.out.println(element);
        }
    

    【讨论】:

    • 使用intellij :: Trace current stream chain特性会很好,用于lambda调试,直观易懂。
    【解决方案2】:

    了解您正在使用的数据结构及其用途。

    您可以通过不同的数据结构来完成相同的工作,例如 [List,Set,Array,Vector,Stack,Queue 等]。但每个人都有自己的特点。

    队列用于先进先出,您以相同的方式访问元素,要访问下一个元素,应将第一个元素移出它

    【讨论】:

    • 这不是BlockingQueue,因为这是它的主要功能。有时我需要查看队列内容,而不会损害take() 的其他线程。有什么建议吗?
    • @Elist,告诉我你在哪里看到 BlockingQueue 或任何其他队列实现具有此功能
    • 请记住,您可以通过迭代来获取 Queue 的所有元素 [不可预测的顺序],但除非您删除元素或实现自己的 Queue,否则您永远无法获得 FIFO 顺序。
    【解决方案3】:

    为此使用 while lopp

    while ((value=q.poll())!=null)
                System.out.println(value);
        }
    

    【讨论】:

    • 这将清空队列!
    猜你喜欢
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多