我想知道如何处理以下场景:
当生产者醒来,并开始在队列中放置元素(简单地从列表中传输对象)时,让我们一次假设100个元素,消费者会立即醒来,在生产者放置100个元素之前清空队列吗?
或者,我可以期待消费线程休眠一段时间吗?
发布于 2018-07-06 11:50:13
LinkedBlockingQueue对其所有操作都使用单锁(ReentrantLock)。
在您的情况下,当您同时说100个元素时,它意味着调用put方法100次。put方法尝试在插入之前先获得锁。因此,很有可能给消费者线程一个机会,它可以耗尽队列。
此外,烧烤使用不公平的锁,所以饥饿的机会是很可能的。
发布于 2018-07-06 18:35:28
谢谢你我做了个小小的测试
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);
}输出
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:::::0https://stackoverflow.com/questions/51196664
复制相似问题