首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LinkedBlockingQueue的内部工作

LinkedBlockingQueue的内部工作
EN

Stack Overflow用户
提问于 2018-07-05 17:03:40
回答 2查看 41关注 0票数 0

我想知道如何处理以下场景:

  • ScheduledThreadPool一次产生N个元素,每秒钟。
  • 热切的使用者,它试图从队列中创建N个对象的批次,而不是一个接一个地处理。

当生产者醒来,并开始在队列中放置元素(简单地从列表中传输对象)时,让我们一次假设100个元素,消费者会立即醒来,在生产者放置100个元素之前清空队列吗?

或者,我可以期待消费线程休眠一段时间吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-06 11:50:13

LinkedBlockingQueue对其所有操作都使用单锁(ReentrantLock)。

在您的情况下,当您同时说100个元素时,它意味着调用put方法100次。put方法尝试在插入之前先获得锁。因此,很有可能给消费者线程一个机会,它可以耗尽队列。

此外,烧烤使用不公平的锁,所以饥饿的机会是很可能的。

票数 0
EN

Stack Overflow用户

发布于 2018-07-06 18:35:28

谢谢你我做了个小小的测试

代码语言:javascript
复制
private static void raceforIntegers() {
    BlockingDeque<Integer> q = new LinkedBlockingDeque<>();

    ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor();
    // Delay producer 1 sec, so consumer always waits at 1st 
    ex.scheduleAtFixedRate(() -> {
                if (q.isEmpty()) {
                    Stream.iterate(0,  i -> ++i)
                            .limit(10)
                            .forEach(q::add);
                } else {
                    ex.shutdown();
                }
            }, 1L, 1L, TimeUnit.SECONDS);


    consumeIntegers(q);
}

private static void consumeIntegers(BlockingDeque<Integer> q) {
    int elememts = 30;
    StringBuilder sb = new StringBuilder();
    do {
        try {
            int n = q.take();
            int s = q.size();
            sb.append(s + ":::::" + n + "\n");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    } while (elememts-- > 0);
    System.out.println(sb);
}

输出

代码语言:javascript
复制
Size  Num
1:::::0
8:::::1
7:::::2
6:::::3
5:::::4
4:::::5
3:::::6
2:::::7
1:::::8
0:::::9

5:::::0
8:::::1
7:::::2
6:::::3
5:::::4
4:::::5
3:::::6
2:::::7
1:::::8
0:::::9

3:::::0
7:::::1
7:::::2
6:::::3
5:::::4
4:::::5
3:::::6
2:::::7
1:::::8
0:::::9
9:::::0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51196664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档