gpt4 book ai didi

java - 为什么消费者线程只在生产者写完 10 个对象时才执行

转载 作者:行者123 更新时间:2023-12-03 12:58:58 25 4
gpt4 key购买 nike

我无法理解为什么消费者线程只有在生产者完成写入 10 个对象时才会执行。如果我根据 javadoc 看到它,则仅当同步块(synchronized block)完成时才执行线程,我不认为在以下情况下该 block 已完成,因为执行在同步块(synchronized block)内的循环中进行。

根据 java doc notify 方法注释

The awakened thread will not be able to proceed until the current thread relinquishes the lock on this object.


        Runnable consumer = (() -> {
synchronized (BUFFER) {
while(true) {
try {
while(BUFFER.isEmpty()) {
BUFFER.wait();
}
System.out.println("consuming "+BUFFER.poll());
System.out.println("size "+BUFFER.size());
TimeUnit.SECONDS.sleep(1);
BUFFER.notify();
} catch (InterruptedException e) {

}
}
}});

Runnable producer = (() -> {
synchronized (BUFFER) {
while(true) {
try {
while(BUFFER.size() == 10) {
BUFFER.wait();
}
Random random = new Random();
System.out.println("producing "+BUFFER.offer(random.nextInt()));
TimeUnit.SECONDS.sleep(1);
BUFFER.notify();
} catch (Exception e) {
}
}
}
});

executor.submit(consumer);
executor.submit(producer);


OUTPUT

producing true
producing true
producing true
producing true
producing true
producing true
producing true
producing true
producing true
producing true
consuming 1494680650
size 9
consuming 2055368049
size 8
[comment]: SUCCESS: Assembly.Load(ProcMonInject, Version=2.7.5159.0, Culture=neutral, PublicKeyToken=d34a061f079be347)
consuming 569414348
size 7
consuming -1146378118
size 6
consuming -2025680888
size 5
consuming -1624438827
size 4
consuming -2035450589
size 3
consuming 953341046
size 2
consuming 776364558
size 1
consuming -2019340509
size 0
producing true

最佳答案

当您从生产者线程调用 BUFFER.notify() 时,消费者线程将被唤醒并尝试获取 Buffer 对象上的锁。但是生产者线程仍然拥有缓冲区对象的锁(因此消费者必须等待它被释放)。当生产者满足条件时while(BUFFER.size() == 10)它将释放缓冲区对象上的锁。
这次消费者将获取锁并消耗缓冲区。直到满足条件while(BUFFER.isEmpty())并释放锁。

仅供引用;生产者-消费者可以在不使用锁的情况下编写,LinkedBlockingQueue类(class)。 (如果你给队列一个容量,当容量满时生产者线程将被阻塞。当队列中没有项目时,消费者线程将被阻塞。)

关于java - 为什么消费者线程只在生产者写完 10 个对象时才执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55401524/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com